CrazyIter_Bin 3 年之前
父节点
当前提交
1fc4011b21

+ 134 - 1
TEAMModelOS.SDK/Models/Service/SchoolService.cs

@@ -1,4 +1,5 @@
-using Microsoft.AspNetCore.Hosting;
+using HTEXLib.COMM.Helpers;
+using Microsoft.AspNetCore.Hosting;
 using Microsoft.International.Converters.PinYinConverter;
 using Microsoft.International.Converters.TraditionalChineseToSimplifiedConverter;
 using System;
@@ -9,13 +10,145 @@ using System.Text;
 using System.Text.Json;
 using System.Text.RegularExpressions;
 using System.Threading.Tasks;
+using TEAMModelOS.Models;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
+using TEAMModelOS.SDK.Models;
 
 namespace TEAMModelOS.SDK
 {
     public class SchoolService
     {
+
+        public static async Task<object> DoScsApiSchool(HttpTrigger _httpTrigger,Dictionary<string,object> dict, Option _option, List<IdNameCode> ignore,
+            string areaId,string city,string dist, AzureStorageFactory _azureStorage ,DingDing _dingDing, IWebHostEnvironment _environment
+            )
+        {
+            List<ScSchool> tbschools = null;
+            List<ScSchool> matchSchools = null;
+            List<ScSchool> schools = null;
+            List<ScSchool> saveschools = null;
+            // 5.3.1.18根据机构ID、项目ID、子项目ID返回学校列表
+            (  int status, string json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetSchoolList");
+            if (status == 200)
+            {
+                schools = json.ToObject<List<ScSchool>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
+                if (ignore.IsNotEmpty())
+                {
+                    matchSchools = schools.FindAll(x => ignore.Select(y => y.name).Contains(x.schoolname));
+                    if (matchSchools.IsNotEmpty())
+                    {
+                        if (matchSchools.Count != ignore.Count)
+                        {
+                            var matched = matchSchools.Select(x => x.schoolname);
+                            var unmatch = ignore.Select(y => y.name).Except(matched);
+                            List<string> scschoolUnmatch = schools.Select(y => y.schoolname).Except(matched).ToList();
+                            if (scschoolUnmatch.IsNotEmpty())
+                            {
+                                return new { matched, unmatch, scschoolUnmatch };
+                            }
+                        }
+                        else
+                        {
+                            matchSchools.ForEach(x => {
+                                var exschool = ignore.Find(y => y.name.Equals(x.schoolname));
+                                if (exschool != null)
+                                {
+                                    x.schoolCode = exschool.id;
+                                    x.areaId = $"{areaId}";
+                                    x.city = $"{city}";
+                                    x.dist = $"{dist}";
+                                }
+                            });
+                        }
+                    }
+                    else
+                    {
+                        return new { unmatch = ignore, schools };
+                    }
+                }
+                //数据校验
+                tbschools = await _azureStorage.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" } });
+                if (tbschools.IsNotEmpty())
+                {
+
+                    var a = tbschools.Select(y => $"{y.RowKey}").ToList();
+                    saveschools = schools.Where(x => !a.Exists(z => z.Equals($"{x.schoolid}"))).ToList();
+                    List<SchoolData> schoolDatas = new List<SchoolData>();
+                    saveschools.ForEach(x =>
+                    {
+                        x.RowKey = $"{x.schoolid}";
+                        x.PartitionKey = "ScSchool";
+                        x.areaId = $"{areaId}";
+                        x.city = $"{city}";
+                        x.dist = $"{dist}";
+                        if (string.IsNullOrEmpty(x.schoolCode))
+                        {
+                            if (string.IsNullOrEmpty(x.schoolCode))
+                            {
+                                schoolDatas.Add(new SchoolData { uid = $"{x.schoolid}", province = "四川省", city = $"{city}", name = x.schoolname });
+                            }
+                           
+                        }
+                    });
+                    schoolDatas = await SchoolService.GenerateSchoolCode(schoolDatas, _dingDing, _environment);
+                    saveschools.ForEach(x => {
+
+                        var schoolData = schoolDatas.Find(y => y.uid.Equals($"{x.schoolid}"));
+                        if (schoolData != null && !string.IsNullOrEmpty(schoolData.id))
+                        {
+                            x.schoolCode = schoolData.id;
+                            x.areaId = $"{areaId}";
+                            x.city = $"{city}";
+                            x.dist = $"{dist}";
+                        }
+                    });
+                    saveschools.RemoveAll(x => string.IsNullOrEmpty(x.schoolCode));
+                    saveschools.RemoveAll(x => tbschools.FindAll(z => !string.IsNullOrEmpty(z.schoolCode)).Exists(y => y.schoolCode.Equals(x.schoolCode)));
+                    saveschools = await _azureStorage.SaveAll(saveschools);
+                }
+                else
+                {
+                    List<SchoolData> schoolDatas = new List<SchoolData>();
+                    schools.ForEach(x =>
+                    {
+                        x.RowKey = $"{x.schoolid}";
+                        x.PartitionKey = "ScSchool";
+                        x.areaId = $"{areaId}";
+                        x.city = $"{city}";
+                        x.dist = $"{dist}";
+                        var a = ignore.Find(z => z.name.Equals(x.schoolname));
+                        if (a != null)
+                        {
+                            x.schoolCode = a.id;
+                        }
+                        else
+                        {
+                            if (string.IsNullOrEmpty(x.schoolCode))
+                            {
+                                schoolDatas.Add(new SchoolData { uid = $"{x.schoolid}", province = "四川省", city = $"{city}", name = x.schoolname });
+                            }
+                        }
+                    });
+                    schoolDatas = await SchoolService.GenerateSchoolCode(schoolDatas, _dingDing, _environment);
+                    schools.ForEach(x => {
+                        var schoolData = schoolDatas.Find(y => y.uid.Equals($"{x.schoolid}"));
+                        if (schoolData != null && !string.IsNullOrEmpty(schoolData.id))
+                        {
+                            x.schoolCode = schoolData.id;
+                            x.areaId = $"{areaId}";
+                            x.city = $"{city}";
+                            x.dist = $"{dist}";
+                        }
+                    });
+
+                    schools.RemoveAll(x => string.IsNullOrEmpty(x.schoolCode));
+                    saveschools = await _azureStorage.SaveOrUpdateAll(schools);
+                }
+            }
+            return null;
+        }
+
         public static async Task<List<SchoolData>> GenerateSchoolCode(List<SchoolData> schools, DingDing _dingDing, IWebHostEnvironment _environment)
         {
             string path = $"{_environment.ContentRootPath}/JsonFile/Core/region.json";

+ 12 - 0
TEAMModelOS.SDK/Models/Service/Third/ThirdService.cs

@@ -27,9 +27,21 @@ namespace TEAMModelOS.SDK.Models
                 {
                     try
                     {
+                       
                         School school = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(scSchool.schoolCode, new PartitionKey("Base"));
+                        
                         if (school != null)
                         {
+                            if (scTeachers.IsNotEmpty())
+                            {
+                                if (string.IsNullOrEmpty(scTeachers[0].tmdid))
+                                {
+                                    scTeachers[0].tmdid = teacher.id;
+                                    scTeachers[0].schoolCode = scSchool.schoolCode;
+                                    scTeachers[0].areaId = school.areaId;
+                                    await _azureStorage.Update<ScTeacher>(scTeachers[0]);
+                                }
+                            }
                             var sc = teacher.schools.Find(x => x.schoolId.Equals(scSchool.schoolCode));
                             if (sc != null)
                             {

+ 57 - 12
TEAMModelOS/Controllers/Third/ScController.cs

@@ -95,7 +95,21 @@ namespace TEAMModelOS.Controllers.Third
             _httpTrigger = httpTrigger;
             _environment = environment;
         }
-
+        /// <summary>
+        /// 检查醍摩豆id存在多个学校的情况
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("sc/delete-school-teacher")]
+        [AllowAnonymous]
+        public async Task<IActionResult> DeleteSchoolTeacher(JsonElement request) {
+            List<ScSchool> delScSchool = await _azureStorage.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" }, { "areaId", "99a4a33b-e21b-44ac-80a1-b31dc40496e0" } });
+            await _azureStorage.DeleteAll(delScSchool);
+            List<ScTeacher> delScTeacher = await _azureStorage.FindListByDict<ScTeacher>(new Dictionary<string, object>() { { "PartitionKey", "ScTeacher" }, { "areaId", "99a4a33b-e21b-44ac-80a1-b31dc40496e0" } });
+            await _azureStorage.DeleteAll(delScTeacher);
+            return Ok(request);
+        }
 
 
         /// <summary>
@@ -107,10 +121,6 @@ namespace TEAMModelOS.Controllers.Third
         [HttpPost("sc/get-project-school-teacher")]
         [AllowAnonymous]
         public async Task<IActionResult> GetProjectSchoolTeacher(JsonElement request) {
-            List<ScSchool > delScSchool = await _azureStorage.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" },{ "areaId", "99a4a33b-e21b-44ac-80a1-b31dc40496e0" } });
-            await _azureStorage.DeleteAll(delScSchool);
-            List <ScTeacher> delScTeacher = await _azureStorage.FindListByDict<ScTeacher>(new Dictionary<string, object>() { { "PartitionKey", "ScTeacher" }, { "areaId", "99a4a33b-e21b-44ac-80a1-b31dc40496e0" } });
-            await _azureStorage.DeleteAll(delScTeacher);
             if (!request.TryGetProperty("accessConfig", out JsonElement accessConfig)) return BadRequest();
             if (!request.TryGetProperty("ignoreSchools", out JsonElement ignoreSchools)) return BadRequest();
             if (!request.TryGetProperty("city", out JsonElement city)) return BadRequest();
@@ -181,9 +191,17 @@ namespace TEAMModelOS.Controllers.Third
                         x.areaId = $"{areaId}";
                         x.city = $"{city}";
                         x.dist = $"{dist}";
-                        if (string.IsNullOrEmpty(x.schoolCode))
+                        var a = ignore.Find(z => z.name.Equals(x.schoolname));
+                        if (a != null)
+                        {
+                            x.schoolCode = a.id;
+                        }
+                        else
                         {
-                            schoolDatas.Add(new SchoolData { uid = $"{x.schoolid}", province = "四川省", city = $"{city}", name = x.schoolname });
+                            if (string.IsNullOrEmpty(x.schoolCode))
+                            {
+                                schoolDatas.Add(new SchoolData { uid = $"{x.schoolid}", province = "四川省", city = $"{city}", name = x.schoolname });
+                            }
                         }
                     });
 
@@ -331,6 +349,7 @@ namespace TEAMModelOS.Controllers.Third
             List<ScTeacher> teachers = new();
             // Table获取的学生
             List<ScTeacher> areaTeacher = new();
+            List<ScTeacher> repeat = new();
             // 5.3.1.2获取学员名单
             (status, json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetTeachersListByProject");
             if (status == 200)
@@ -378,7 +397,7 @@ namespace TEAMModelOS.Controllers.Third
                             if (binds.IsNotEmpty()) {
                                 List<ScTeacher> update = new List<ScTeacher>();
                                 binds.ForEach(x => {
-                                   var exs= unbindtmdid.FindAll(z => z.TID.Equals(x.userid));
+                                   var exs= unbindtmdid.FindAll(z => $"{z.TID}".Equals(x.userid));
                                     if (exs.IsNotEmpty()) {
                                         exs.ForEach(y => {
                                             y.tmdid = x.id;
@@ -386,7 +405,19 @@ namespace TEAMModelOS.Controllers.Third
                                         update.AddRange(exs);
                                     }
                                 });
-                                update = await _azureStorage.SaveOrUpdateAll(update);
+                                var group= update.GroupBy(x => x.RowKey).Select(z=>new { z.Key ,list= z.ToList()});
+                                List<ScTeacher> scTeachers = new();
+                                group.ToList().ForEach(x => {
+                                    if (x.list.Count() == 1)
+                                    {
+                                        scTeachers.Add(x.list[0]);
+                                    }
+                                    else if(x.list.Count>1) {
+                                        scTeachers.Add(x.list[0]);
+                                        repeat.AddRange(x.list);
+                                    }
+                                });
+                                scTeachers = await _azureStorage.SaveOrUpdateAll(scTeachers);
                             }
                         }
                     }
@@ -407,7 +438,7 @@ namespace TEAMModelOS.Controllers.Third
                             {
                                 
                                 binds.ForEach(x => {
-                                    var exs = teachers.FindAll(z => z.TID.Equals(x.userid));
+                                    var exs = teachers.FindAll(z => $"{z.TID}".Equals(x.userid));
                                     if (exs.IsNotEmpty())
                                     {
                                         exs.ForEach(y => {
@@ -417,7 +448,20 @@ namespace TEAMModelOS.Controllers.Third
                                 });
                             }
                         }
-                        teachers = await _azureStorage.SaveAll(teachers);
+                        var group = teachers.GroupBy(x => x.RowKey).Select(z => new { z.Key, list = z.ToList() });
+                        List<ScTeacher> scTeachers = new();
+                        group.ToList().ForEach(x => {
+                            if (x.list.Count() == 1)
+                            {
+                                scTeachers.Add(x.list[0]);
+                            }
+                            else if (x.list.Count > 1)
+                            {
+                                scTeachers.Add(x.list[0]);
+                                repeat.AddRange(x.list);
+                            }
+                        });
+                        scTeachers = await _azureStorage.SaveOrUpdateAll(scTeachers);
                   }
                 }
             }
@@ -429,7 +473,8 @@ namespace TEAMModelOS.Controllers.Third
                 schoolsfailed,
                 failedmsg,
                 schoolsScucess,
-                tbsch= tbschools.Select(x=>new { x.schoolname,x.schoolCode})
+                tbsch= tbschools.Select(x=>new { x.schoolname,x.schoolCode}),
+                repeat
             });
         }
         public class  DbBind{

+ 37 - 0
TEAMModelOS/Controllers/XTest/FixDataController.cs

@@ -76,6 +76,43 @@ namespace TEAMModelOS.Controllers
                     {
                         sc.status = "join";
                     }
+                    try
+                    {
+                        SchoolTeacher schoolTeacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolTeacher>(teacher.id, new PartitionKey($"Teacher-{sc.schoolId}"));
+                        if (schoolTeacher != null)
+                        {
+                            if (schoolTeacher.roles.IsEmpty() || !schoolTeacher.roles.Contains("admin"))
+                            {
+                                schoolTeacher.roles = new List<string> { "admin" };
+                            }
+                            schoolTeacher.status = "join";
+                            schoolTeacher.pk = "Teacher";
+                            schoolTeacher.name = teacher.name;
+                            schoolTeacher.picture = teacher.picture;
+                            schoolTeacher.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                            schoolTeacher.ttl = -1;
+                            schoolTeacher.permissions = schoolTeacher.permissions.IsNotEmpty() ? schoolTeacher.permissions : new List<string>();
+                            await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").UpsertItemAsync(schoolTeacher);
+                        }
+                    }
+                    catch (CosmosException ex)
+                    {
+                        SchoolTeacher schoolTeacher = new SchoolTeacher
+                        {
+                            id = teacher.id,
+                            code = $"Teacher-{sc.schoolId}",
+                            roles = new List<string> { "teacher" },
+                            permissions = new List<string>(),
+                            pk = "Teacher",
+                            name = teacher.name,
+                            picture = teacher.picture,
+                            status = "join",
+                            createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
+                            ttl = -1
+                        };
+                        await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").UpsertItemAsync(schoolTeacher);
+                    }
+
                 }
                 else {
                     teacher.schools.Add(new Teacher.TeacherSchool { schoolId = item.id, name = item.name, areaId = item.areaId, picture = item.picture, time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), status = "join" });