Browse Source

学生id导入

CrazyIter 5 years ago
parent
commit
c48160df56

+ 49 - 5
TEAMModelOS.SDK/Module/AzureCosmosDB/Implements/AzureCosmosDBRepository.cs

@@ -19,6 +19,7 @@ using Microsoft.Azure.CosmosDB.BulkExecutor.BulkUpdate;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using Microsoft.Azure.CosmosDB.BulkExecutor.BulkDelete;
 using TEAMModelOS.SDK.Context.Attributes.Azure;
+using System.Text;
 
 namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Implements
 { /// <summary>
@@ -148,15 +149,18 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Implements
         }
         public async Task<T> Save<T>(T entity)  //where T : object, new()
         {
-            try {
+            try
+            {
                 Type t = typeof(T);
                 DocumentCollection documentCollection = await InitializeCollection<T>();
                 ResourceResponse<Document> doc =
                     await CosmosClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(Database, t.Name), entity);
                 //Console.WriteLine(doc.ActivityId);
                 return entity;
-            } catch (Exception e ) {
-                throw  new  BizException(e.Message);
+            }
+            catch (Exception e)
+            {
+                throw new BizException(e.Message);
             }
         }
 
@@ -299,7 +303,6 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Implements
                     }
                 }
             }
-
             foreach (string key in dict.Keys)
             {
                 //if (t.Name.Equals(key)) {
@@ -319,7 +322,6 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Implements
             //查询条数 -1是全部
             FeedOptions queryOptions = new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = open };
             var query = CosmosClient.CreateDocumentQuery<T>(UriFactory.CreateDocumentCollectionUri(Database, t.Name), queryOptions);
-            var ass = DynamicLinq.GenerateFilter<T>(query, filters);
             List<T> list = DynamicLinq.GenerateFilter<T>(query, filters).ToList();
             return list;
             //return CosmosClient.CreateDocumentQuery<T>(UriFactory.CreateDocumentCollectionUri(Database, t.Name),sql);
@@ -560,5 +562,47 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Implements
                 default: return null;
             }
         }
+
+        public async Task<List<T>> FindByDict<T>(Dictionary<string, object> dict, bool IsPk)
+        {
+            Type t = typeof(T);
+            List<T> objs = new List<T>();
+            Boolean open = IsPk;
+            await InitializeCollection<T>();
+
+            StringBuilder sql = new StringBuilder("select * from c where 1=1 ");
+            if (dict != null)
+            {
+                foreach (string key in dict.Keys)
+                {
+                    sql.Append(GenSql(dict[key], key));
+                }
+            }
+            //查询条数 -1是全部
+            FeedOptions queryOptions = new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = IsPk };
+            var query = CosmosClient.CreateDocumentQuery<T>(UriFactory.CreateDocumentCollectionUri(Database, t.Name), sql.ToString(), queryOptions);
+            foreach (var item in query)
+            {
+                objs.Add(item);
+            }
+            return objs;
+        }
+
+        private static string GenSql(object obj, string key)
+        {
+            Type s = obj.GetType();
+            TypeCode typeCode = Type.GetTypeCode(s);
+            switch (typeCode)
+            {
+                case TypeCode.String: return "and c." + key + "=" + "'" + obj.ToString() + "'";
+                case TypeCode.Int32: return "and c." + key + "=" + int.Parse(obj.ToString());
+                case TypeCode.Double: return "and c." + key + "=" + double.Parse(obj.ToString());
+                //case TypeCode.Byte: return "and c." + key + "=" + (Byte)obj ;   
+                case TypeCode.Boolean: return "and c." + key + "=" + bool.Parse(obj.ToString());
+                case TypeCode.DateTime: return "and c." + key + "=" + (DateTime)obj;
+                case TypeCode.Int64: return "and c." + key + "=" + long.Parse(obj.ToString());
+                default: return null;
+            }
+        }
     }
 }

+ 1 - 0
TEAMModelOS.SDK/Module/AzureCosmosDB/Interfaces/IAzureCosmosDBRepository.cs

@@ -20,6 +20,7 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces
         Task<List<T>> FindSQL<T>(string sql, bool isPK);
         Task<List<T>> FindLinq<T>(Func<IQueryable<object>, object> singleOrDefault);
         Task<List<T>> FindByParams<T>(Dictionary<string, object> dict);
+        Task<List<T>> FindByDict<T>(Dictionary<string, object> dict, bool isPK);
         Task<List<T>> SaveAll<T>(List<T> enyites);
         Task<List<T>> UpdateAll<T>(Dictionary<string, object> dict, Dictionary<string, object> updateFilters, List<string> deleteKeys = null);
         Task<List<T>> DeleteAll<T>(Dictionary<string, object> dict);

+ 0 - 16
TEAMModelOS.Service/Models/Core/ClassRoomStudent.cs

@@ -1,16 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace TEAMModelOS.Service.Models.Core
-{
-   public class ClassroomStudent
-    {
-        public string id { get; set; }
-        public string classroomCode { get; set; }
-        public string TEAMModelId { get; set; }
-        public string schoolCode { get; set; }
-        public string periodCode { get; set; }
-        public string gradeCode { get; set; }
-    }
-}

+ 8 - 8
TEAMModelOS.Service/Models/Core/Student.cs

@@ -19,10 +19,9 @@ namespace TEAMModelOS.Service.Models.Core
         public string email { get; set; }
         public string cellphone { get; set; }
         public string countryCode { get; set; }
-        public string verifyFlg { get; set; }
-        public string status { get; set; }
-        public string createDate { get; set; }
-        public string studentId { get; set; }
+        public int verifyFlg { get; set; }
+        public int status { get; set; } = 0;
+        public long createDate { get; set; }
         public Password password { get; set; }
         public string exValue { get; set; }
         public string product { get; set; }
@@ -40,20 +39,21 @@ namespace TEAMModelOS.Service.Models.Core
         public string virtualId { get; set; }
         public List<Oauth> oauth { get; set; } // 0 1
         public string haveDevice { get; set; }//2
-        
+        public Classroom classroom { get; set; }
+        public string studentId { get; set; }
     }
 }
 public class Password {
     public string value { get; set; }
-    public bool isSet { get; set; }
-    public bool isReset { get; set; }
+    public bool isSet { get; set; } = true;
+    public bool isReset { get; set; } = false;
 }
 public class ProductToken
 {
     public string station { get; set; }
     public string url { get; set; }
     public string licenseStatus { get; set; }
-    public int exp { get; set; }
+    public string exp { get; set; }
     public string memberId { get; set; }
 }
 public class Oauth

+ 33 - 18
TEAMModelOS/Controllers/Core/StudentController.cs

@@ -11,6 +11,7 @@ using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 using System.Text.Json;
 using TEAMModelOS.Models;
+using TEAMModelOS.SDK.Extension.SnowFlake;
 
 namespace TEAMModelOS.Controllers.Syllabus
 {
@@ -38,48 +39,62 @@ namespace TEAMModelOS.Controllers.Syllabus
         public async Task<BaseJosnRPCResponse> FindStudent(JosnRPCRequest<Dictionary<string, object>> request)
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-
-            if (request.@params.TryGetValue("SchoolCode", out object SchoolCode))
+            StringBuilder sql = new StringBuilder();
+            if (request.@params.TryGetValue("schoolCode", out object schoolCode))
             {
-                List<Student> data = await azureCosmosDBRepository.FindByParams<Student>(request.@params);
+                List<Student> data = await azureCosmosDBRepository.FindByDict<Student>(request.@params,false);
                 return builder.Data(data).build();
             }
             else
             {
-                return builder.Error("SchoolCode  is null !").build();
+                return builder.Error("schoolCode  is null !").build();
             }
         }
         [HttpPost("SaveAllStudent")]
         public async Task<BaseJosnRPCResponse> SaveAllStudentInfo(JosnRPCRequest<List<StudentDto>> request)
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-            Dictionary<string, List<Student>> dictInfo = new Dictionary<string, List<Student>>();
-            foreach (IGrouping<string, Student> group in request.@params.GroupBy(c => c.classroomCode))
+            Dictionary<string, List<StudentDto>> dictInfo = new Dictionary<string, List<StudentDto>>();
+            foreach (IGrouping<string, StudentDto> group in request.@params.GroupBy(c => c.classroomCode))
             {
                 dictInfo.Add(group.Key, group.ToList());
             }
-            List<Student> studentInfos = new List<Student>();
+            List<Student> students = new List<Student>();
             foreach (string key in dictInfo.Keys)
             {
-                List<Classroom> classroom = await azureCosmosDBRepository.FindByParams<Classroom>(new Dictionary<string, object> { { "classroomCode", key } });
-                if (classroom.IsNotEmpty())
+                List<Classroom> classrooms = await azureCosmosDBRepository.FindByParams<Classroom>(new Dictionary<string, object> { { "classroomCode", key } });
+                if (classrooms.IsNotEmpty())
                 {
-                    dictInfo.TryGetValue(key, out List<Student> sts);
+                    long createDate = DateTimeOffset.UtcNow.Ticks;
+                    dictInfo.TryGetValue(key, out List<StudentDto> sts);
+                    List<long>  ids= IdWorker.getIdsByCount(sts.Count);
                     sts.ForEach(x => {
-                       // x.gradeCode = classroom[0].gradeCode;
-                       // x.periodCode = classroom[0].periodCode;
-                        x.schoolCode = classroom[0].schoolCode;
-                        x.id = x.studentId;
+                        Student student = new Student
+                        {
+                            schoolCode = classrooms[0].schoolCode,
+                            id = x.schoolCode + x.studentId,
+                            TEAMModelId = x.schoolCode + "#" + x.studentId,
+                            virtualId = x.schoolCode + "#" + x.studentId,
+                            createDate = createDate
+                        };
+                        Classroom classroom = new Classroom
+                        {
+                            classroomCode = x.classroomCode,
+                            gradeCode = classrooms[0].gradeCode,
+                            periodCode = classrooms[0].periodCode,
+                            schoolCode = classrooms[0].schoolCode,
+                        };
+                        student.classroom = classroom;
+                        students.Add(student);
                     });
-                    List<Student> data = await azureCosmosDBRepository.SaveAll<Student>(sts);
-                    studentInfos.AddRange(data);
+                    await azureCosmosDBRepository.SaveAll(students);
                 }
             }
-            return builder.Data(studentInfos).build();
+            return builder.Data(students).build();
         }
 
         [HttpPost("UpdateStudent")]
-        public async Task<BaseJosnRPCResponse> UpdateStudentInfo(JosnRPCRequest<Student> request)
+        public async Task<BaseJosnRPCResponse> UpdateStudentInfo(JosnRPCRequest<StudentDto> request)
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
             Student data = await azureCosmosDBRepository.Update<Student>(request.@params);

+ 5 - 1
TEAMModelOS/Models/StudentDto.cs

@@ -6,8 +6,12 @@ using TEAMModelOS.Service.Models.Core;
 
 namespace TEAMModelOS.Models
 {
-    public class StudentDto : Student
+    /// <summary>
+    /// 用于批量导入使用
+    /// </summary>
+    public class StudentDto :Student
     {
         public string classroomCode { get; set; }
+        
     }
 }