Browse Source

ServiceBus

CrazyIter 4 years ago
parent
commit
4a90d862df

+ 74 - 0
TEAMModelOS.SDK/Module/AzureServiceBus/AzureServiceBusClientSingleton.cs

@@ -0,0 +1,74 @@
+using Microsoft.Azure.ServiceBus;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Module.AzureServiceBus
+{
+    public  class AzureServiceBusClientSingleton
+    {
+
+        private ServiceBusModel ServiceBusModel;
+        public static AzureServiceBusOptions azureServiceBusOptions;
+        private AzureServiceBusClientSingleton() { }
+        public ServiceBusModel GetServiceBusClient()
+        {
+            if (ServiceBusModel != null)
+            {
+                return ServiceBusModel;
+            }
+            else
+            {
+                getInstance(azureServiceBusOptions);
+                return ServiceBusModel;
+            }
+        }
+        public static AzureServiceBusClientSingleton getInstance(AzureServiceBusOptions _azureServiceBusOptions)
+        {
+            azureServiceBusOptions= _azureServiceBusOptions;
+          
+         
+            return SingletonInstance.instance;
+        }
+
+        private static class SingletonInstance
+        {
+            public static AzureServiceBusClientSingleton instance = new AzureServiceBusClientSingleton()
+            {
+                ServiceBusModel = new ServiceBusModel { topClients = GetTopClients(),subClients=GetSubClients() }
+            };
+        }
+
+        private static Dictionary<string, TopClient> GetTopClients() {
+            Dictionary<string, TopClient> topClients = new Dictionary<string, TopClient>();
+            string ConnectionString = azureServiceBusOptions.ConnectionString;
+            azureServiceBusOptions.Topics.ForEach(x=> { topClients.TryAdd(x.Name, new TopClient { topicClient = new TopicClient(ConnectionString, x.Name) }); });
+            return topClients;
+        }
+        private static Dictionary<string, SubClient> GetSubClients()
+        {
+            Dictionary<string, SubClient>  subClients = new Dictionary<string, SubClient>();
+            string ConnectionString = azureServiceBusOptions.ConnectionString;
+            azureServiceBusOptions.Topics.ForEach(x => { x.Subscribe.ForEach(y => { subClients.TryAdd(y, new SubClient { topName = x.Name, subscriptionClient = new SubscriptionClient(ConnectionString, x.Name, y) }); }); });
+            return subClients;
+        }
+    }
+
+
+    public class ServiceBusModel {
+       public Dictionary<string, TopClient> topClients { get; set; } = new Dictionary<string, TopClient>();
+        public Dictionary<string, SubClient> subClients { get; set; } = new Dictionary<string, SubClient>();
+       
+    }
+
+    public class TopClient { 
+       
+        public ITopicClient topicClient { get; set; }
+    }
+    public class SubClient
+    {
+        public string topName { get; set; }
+       
+        public ISubscriptionClient subscriptionClient { get; set; }
+    }
+}

+ 39 - 0
TEAMModelOS.SDK/Module/AzureServiceBus/AzureServiceBusCollectionExtensions.cs

@@ -0,0 +1,39 @@
+using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using TEAMModelOS.SDK.Module.AzureServiceBus;
+
+namespace TEAMModelOS.SDK
+{
+    public static class AzureServiceBusCollectionExtensions
+    {
+
+        private static AzureServiceBusServiceBuilder AddServiceBusBuilder(this IServiceCollection services)
+        {
+            return new AzureServiceBusServiceBuilder(services);
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="services"></param>
+        /// <returns></returns>
+        public static AzureServiceBusServiceBuilder AddServiceBus(this IServiceCollection services)
+        {
+            var builder = services.AddServiceBusBuilder();
+            services.AddSingleton<IAzureServiceBusService, AzureServiceBusService>();
+            return builder;
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="builder"></param>
+        /// <param name="_connectionString"></param>
+        /// <returns></returns>
+        public static AzureServiceBusServiceBuilder AddServiceBusOptions(this AzureServiceBusServiceBuilder builder, AzureServiceBusOptions serviceBusOptions)
+        {
+            builder.Services.AddSingleton(serviceBusOptions);
+            return builder;
+        }
+    }
+}

+ 29 - 0
TEAMModelOS.SDK/Module/AzureServiceBus/AzureServiceBusOptions.cs

@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Module.AzureServiceBus
+{
+    /// <summary>
+    /// 主题配置信息
+    /// </summary>
+    public  class AzureServiceBusOptions
+    {
+        public string ConnectionString { get; set; } = null;
+        public List<Topic> Topics { get; set; } = null;
+       
+    }
+    /// <summary>
+    /// 主题
+    /// </summary>
+    public class Topic { 
+        /// <summary>
+        /// 主题名称
+        /// </summary>
+        public string Name { get; set; }
+        /// <summary>
+        /// 主题的订阅器
+        /// </summary>
+        public List<string> Subscribe { get; set; }
+    }
+}

+ 32 - 0
TEAMModelOS.SDK/Module/AzureServiceBus/AzureServiceBusService.cs

@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Module.AzureServiceBus
+{
+    public class AzureServiceBusService :IAzureServiceBusService
+    {
+        public ServiceBusModel serviceBusModel;
+
+        public AzureServiceBusService(AzureServiceBusOptions options) {
+            serviceBusModel = AzureServiceBusClientSingleton.getInstance(options).GetServiceBusClient() ;
+        }
+
+
+        public void init() {
+            if (serviceBusModel != null) {
+                
+            }
+        }
+        public TopClient GetTopClient(string TopName) {
+            serviceBusModel.topClients.TryGetValue(TopName, out TopClient topClient);
+            return topClient;
+        }
+
+        public SubClient GetSubClient(string SubName)
+        {
+            serviceBusModel.subClients.TryGetValue(SubName, out SubClient subClient);
+            return subClient;
+        }
+    }
+}

+ 24 - 0
TEAMModelOS.SDK/Module/AzureServiceBus/AzureServiceBusServiceBuilder.cs

@@ -0,0 +1,24 @@
+using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Module.AzureServiceBus
+{
+    public class AzureServiceBusServiceBuilder
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="services"></param>
+        public AzureServiceBusServiceBuilder(IServiceCollection services)
+        {
+            Services = services ?? throw new ArgumentNullException(nameof(services));
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public IServiceCollection Services { get; }
+    }
+}

+ 13 - 0
TEAMModelOS.SDK/Module/AzureServiceBus/IAzureServiceBusService.cs

@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Module.AzureServiceBus
+{
+    public interface IAzureServiceBusService
+    {
+        public TopClient GetTopClient(string TopName);
+        public SubClient GetSubClient(string SubName);
+        void init();
+    }
+}

+ 1 - 0
TEAMModelOS.SDK/TEAMModelOS.SDK.csproj

@@ -27,6 +27,7 @@
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.3" />
     <PackageReference Include="Microsoft.Azure.CosmosDB.BulkExecutor" Version="2.4.1-preview" />
     <PackageReference Include="Microsoft.Azure.DocumentDB.Core" Version="2.10.1" />
+    <PackageReference Include="Microsoft.Azure.ServiceBus" Version="4.1.3" />
     <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
     <PackageReference Include="Microsoft.Extensions.Caching.Redis" Version="2.2.0" />
     <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.3" />

+ 7 - 1
TEAMModelOS/Controllers/Exam/ExamController.cs

@@ -195,7 +195,9 @@ namespace TEAMModelOS.Controllers
             if (record != null) {
                 //处理客观题自动阅卷
                 Paper paper = await cosmosDBV3Repository.FindByIdPk<Paper>(record.id, record.examCode);
-                if (paper.markConfig != null && paper.markConfig.auto) {
+                //允许自动对客观题阅卷及,及阅卷状态大于2 已完成.
+                if (paper.markConfig != null && paper.markConfig.auto && record.mark>=2) {
+                    // TODO 需要处理已经打分的作答,以防止手动改分后被冲掉。
                     autoMark(paper.item, paper.answers, record.answers, paper.markConfig);
                 }
             }
@@ -205,6 +207,10 @@ namespace TEAMModelOS.Controllers
         public static List<Answer> autoMark(List<ItemInfo> items ,List<Answer> stdAnswers, List<Answer> stuAnswers ,MarkConfig markConfig) {
             int size = stuAnswers.Count;
             for (int i = 0; i < size; i++) {
+                //如果当前题目已经打分则直接跳过。
+                if (stuAnswers[i].score > 0) {
+                    continue;
+                }
                 //客观题
                 if (stuAnswers[i].type.Equals("Single") || stuAnswers[i].type.Equals("Multiple") || stuAnswers[i].type.Equals("Judge")) {
                     //多选题单独处理

+ 13 - 0
TEAMModelOS/Controllers/Syllabus/ItemInfoController.cs

@@ -99,6 +99,19 @@ namespace TEAMModelOS.Controllers
             IdPk idPk = await cosmosDBV3Repository.DeleteAsync<ItemInfo>( request.@params );
             return builder.Data(idPk).build();
         }
+
+        /// <summary>
+        /// 删除
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("deleteAll")]
+        public async Task<BaseJosnRPCResponse> DeleteAll(JosnRPCRequest<Dictionary<string,object>> request)
+        {
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            List<IdPk> idPk = await cosmosDBV3Repository.DeleteAll<ItemInfo>(request.@params);
+            return builder.Data(idPk).build();
+        }
         /// <summary>
         /// 手动挑题
         /// </summary>

+ 7 - 2
TEAMModelOS/Startup.cs

@@ -16,6 +16,7 @@ using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
 using Scrutor;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Context.Attributes.Azure;
 using TEAMModelOS.SDK.Context.Configuration;
 using TEAMModelOS.SDK.Context.Filter;
@@ -23,6 +24,7 @@ using TEAMModelOS.SDK.Extension.JwtAuth;
 using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Configuration;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.SDK.Module.AzureServiceBus;
 using TEAMModelOS.SDK.Module.AzureTable.Implements;
 using TEAMModelOS.SDK.Module.AzureTable.Interfaces;
 using TEAMModelOS.Service.Services.ChangeFeed;
@@ -116,6 +118,8 @@ namespace TEAMModelOS
             //使用CosmosDB
             services.AddAzureCosmosDBV3().AddCosmosDBV3Connection(Configuration.GetSection("Azure:CosmosDB").Get<AzureCosmosDBOptions>())
                 .AddCosmosSerializer(new SystemTextJsonCosmosSerializer(new JsonSerializerOptions() { IgnoreNullValues = true }));
+            //使用AzureServiceBus
+            services.AddServiceBus().AddServiceBusOptions(Configuration.GetSection("HaBookAuth:ServiceBus").Get<AzureServiceBusOptions>());
             //HttpContextAccessor,并用来访问HttpContext。
             services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
             //引入Jwt配置
@@ -142,14 +146,15 @@ namespace TEAMModelOS
         }
 
         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
-        public   void Configure(IApplicationBuilder app, IWebHostEnvironment env, IAzureCosmosDBV3Repository cosmosDBV3Repository, IChangeFeedInvoke changeFeedInvoke)
+        public   void Configure(IApplicationBuilder app, IWebHostEnvironment env, IAzureCosmosDBV3Repository cosmosDBV3Repository, IChangeFeedInvoke changeFeedInvoke,IAzureServiceBusService azureServiceBusService)
         {
             if (env.IsDevelopment())
             {
                 app.UseDeveloperExceptionPage();
             }
-           CosmosDict dict=  cosmosDBV3Repository.InitializeDatabase().Result;
+            CosmosDict dict=  cosmosDBV3Repository.InitializeDatabase().Result;
             changeFeedInvoke.MonitorChangeFeed(dict, _services);
+            azureServiceBusService.init();
             app.UseMiddleware<HttpGlobalExceptionInvoke>();
             //以下需要按照順序載入中間件  如果应用调用 UseStaticFiles,请将 UseStaticFiles 置于 UseRouting之前。
             app.UseStaticFiles();

+ 9 - 1
TEAMModelOS/appsettings.Development.json

@@ -31,7 +31,6 @@
     "TeamModelLoginUrl": "https://account.habookaclass.biz/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJsb2dpbiIsImF1ZCI6ImNoZW5nZHVMb2dpbiIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYxMzUwNDcsIm5iZiI6MTUzNjEzNTA0NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.F4AnkbJrMRoZvJ6SC-lqZEYIYSoq5x8lvX6_a3YqSgM&callback=",
     "AccountUrl": "https://api.habookaclass.biz/account",
     "ServiceUrl": "https://api.habookaclass.biz/service",
-    "ServiceBus": "Endpoint=sb://teammodelos.servicebus.chinacloudapi.cn/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=Sy4h4EQ8zP+7w/lOLi1X3tGord/7ShFHimHs1vC50Dc=",
     "UserInfoKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpZCIsImF1ZCI6ImNoZW5nZHVJZCIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYwNTIzNjcsIm5iZiI6MTUzNjA1MjM2NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.RGKDVtwFEp4OBctlHOuF6yqyI21fTz4cinCxjFCxkSQ",
     "SchoolCodeKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzY2hvb2xDb2RlIiwiYXVkIjoiY2hlbmdkdVNjaG9vbENvZGUiLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTM2MDUyNDI3LCJuYmYiOjE1MzYwNTI0MjcsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.8m5VH3Nz4N9EdMz8AexTOEuDVitcJZFKy9DfW_UQkSY",
     "SmsKey": "Basic ZmYwMWM0YTJjODdmZmNkYTUyNjhmMDEwOmE0YTE5YTVjNTU2ZWVhZTNjZmZhNTI0Mg==",
@@ -47,6 +46,15 @@
         "refresh_token": "{access_token}"
       },
       "url": "https://api2.teammodel.cn/oauth2/token"
+    },
+    "ServiceBus": {
+      "ConnectionString": "Endpoint=sb://teammodelos.servicebus.chinacloudapi.cn/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=Sy4h4EQ8zP+7w/lOLi1X3tGord/7ShFHimHs1vC50Dc=",
+      "Topics": [
+        {
+          "Name": "test_topic_ActiveTask",
+          "Subscribe": [ "test_topic_ReciveTask" ]
+        }
+      ]
     }
   },
   "SmsSendCloud": {