zhouj1203@hotmail.com пре 2 година
родитељ
комит
851f1b2fee

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/ArtMusic.cs

@@ -20,6 +20,8 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common
         public string questionName { get; set; }
         public string questionName { get; set; }
         public List<MustSong> mustSong { get; set; } = new List<MustSong>();
         public List<MustSong> mustSong { get; set; } = new List<MustSong>();
         public List<MustSong> optionSong { get; set; } = new List<MustSong>();
         public List<MustSong> optionSong { get; set; } = new List<MustSong>();
+        //0未作答 1已作答
+        public int isAnswer { get; set; } = 0;
     }
     }
     public class MustSong
     public class MustSong
     { 
     { 

+ 45 - 12
TEAMModelOS/Controllers/Common/ArtController.cs

@@ -22,6 +22,7 @@ using System.Reflection;
 using System.Text;
 using System.Text;
 using System.Text.Json;
 using System.Text.Json;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using System.Xml.Linq;
 using TEAMModelOS.Filter;
 using TEAMModelOS.Filter;
 using TEAMModelOS.Models;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK;
 using TEAMModelOS.SDK;
@@ -78,18 +79,19 @@ namespace TEAMModelOS.Controllers.Common
             try
             try
             {
             {
                 if (!request.TryGetProperty("art", out JsonElement art)) return BadRequest();
                 if (!request.TryGetProperty("art", out JsonElement art)) return BadRequest();
-               
+
                 var client = _azureCosmos.GetCosmosClient();
                 var client = _azureCosmos.GetCosmosClient();
                 ArtEvaluation ae = art.ToObject<ArtEvaluation>();
                 ArtEvaluation ae = art.ToObject<ArtEvaluation>();
                 bool flag = false;
                 bool flag = false;
                 ArtMusic music = new();
                 ArtMusic music = new();
-                if (request.TryGetProperty("ArtMusic", out JsonElement am)) {
+                if (request.TryGetProperty("ArtMusic", out JsonElement am))
+                {
                     music = am.ToObject<ArtMusic>();
                     music = am.ToObject<ArtMusic>();
                     music.ttl = -1;
                     music.ttl = -1;
                     music.code = "ArtMusic";
                     music.code = "ArtMusic";
                     flag = true;
                     flag = true;
                 };
                 };
-                
+
                 var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
                 var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
                 string code = ae.school;
                 string code = ae.school;
                 ae.ttl = -1;
                 ae.ttl = -1;
@@ -106,19 +108,20 @@ namespace TEAMModelOS.Controllers.Common
                 }
                 }
                 if (string.IsNullOrEmpty(ae.id))
                 if (string.IsNullOrEmpty(ae.id))
                 {
                 {
-                   
-                    ae.id = Guid.NewGuid().ToString();                  
+
+                    ae.id = Guid.NewGuid().ToString();
                     await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(ae, new PartitionKey($"{ae.code}"));
                     await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(ae, new PartitionKey($"{ae.code}"));
                     if (flag)
                     if (flag)
                     {
                     {
                         music.id = ae.id;
                         music.id = ae.id;
                         await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(music, new PartitionKey("ArtMusic"));
                         await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(music, new PartitionKey("ArtMusic"));
                     }
                     }
-                    
+
                 }
                 }
                 else
                 else
                 {
                 {
-                    if (flag) {
+                    if (flag)
+                    {
                         await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(music, music.id, new PartitionKey("ArtMusic"));
                         await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(music, music.id, new PartitionKey("ArtMusic"));
                     }
                     }
                     await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(ae, ae.id, new PartitionKey($"{ae.code}"));
                     await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(ae, ae.id, new PartitionKey($"{ae.code}"));
@@ -134,6 +137,34 @@ namespace TEAMModelOS.Controllers.Common
 
 
         }
         }
 
 
+        [ProducesDefaultResponseType]
+        [AuthToken(Roles = "teacher,admin,student")]
+        [HttpPost("update-state")]
+        [Authorize(Roles = "IES")]
+        public async Task<IActionResult> UpdateState(JsonElement request)
+        {
+            if (!request.TryGetProperty("isAnswer", out JsonElement isAnswer)) return BadRequest();
+            if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
+            var client = _azureCosmos.GetCosmosClient();
+            try
+            {
+                ArtMusic music = new();
+                var response = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(id.GetString(), new PartitionKey("ArtMusic"));
+                if (response.Status == 200)
+                {
+                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                    music = json.ToObject<ArtMusic>();
+                    music.isAnswer = isAnswer.GetInt32();
+                    await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(music, music.id, new PartitionKey($"{music.code}"));
+                }
+                return Ok(music);
+            }
+            catch (Exception e)
+            {
+                return BadRequest(new { msg = e.Message });
+            }
+        }
+
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
         [AuthToken(Roles = "teacher,admin,student")]
         [AuthToken(Roles = "teacher,admin,student")]
         [HttpPost("upload")]
         [HttpPost("upload")]
@@ -710,18 +741,20 @@ namespace TEAMModelOS.Controllers.Common
                         {
                         {
                             responses.Add(client.GetContainer(Constant.TEAMModelOS, Constant.Student).CreateItemAsync(z, new PartitionKey(z.code)));
                             responses.Add(client.GetContainer(Constant.TEAMModelOS, Constant.Student).CreateItemAsync(z, new PartitionKey(z.code)));
                         });
                         });
-                        if (responses.Count > 0) {
+                        if (responses.Count > 0)
+                        {
                             await responses.TaskPage(10);
                             await responses.TaskPage(10);
-                        }                      
+                        }
                     }
                     }
                     if (!string.IsNullOrWhiteSpace(ae.id))
                     if (!string.IsNullOrWhiteSpace(ae.id))
                     {
                     {
                         return Ok(new { art, classes, ae, music, code = 200 });
                         return Ok(new { art, classes, ae, music, code = 200 });
                     }
                     }
-                    else {
+                    else
+                    {
                         return Ok(new { art, classes, music, code = 200 });
                         return Ok(new { art, classes, music, code = 200 });
                     }
                     }
-                    
+
 
 
 
 
                 }
                 }
@@ -764,7 +797,7 @@ namespace TEAMModelOS.Controllers.Common
 
 
                     if (!string.IsNullOrWhiteSpace(art.pId))
                     if (!string.IsNullOrWhiteSpace(art.pId))
                     {
                     {
-                        var response = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(art.pId, new PartitionKey("ArtMusic"));                      
+                        var response = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(art.pId, new PartitionKey("ArtMusic"));
                         if (response.Status == 200)
                         if (response.Status == 200)
                         {
                         {
                             using var json = await JsonDocument.ParseAsync(response.ContentStream);
                             using var json = await JsonDocument.ParseAsync(response.ContentStream);

+ 126 - 0
TEAMModelOS/Controllers/School/SchoolController.cs

@@ -664,6 +664,132 @@ namespace TEAMModelOS.Controllers
                 return BadRequest();
                 return BadRequest();
             }
             }
         }
         }
+
+        [ProducesDefaultResponseType]
+        [HttpPost("get-teach-count")]
+        //[AuthToken(Roles = "teacher,admin,student")]
+
+#if !DEBUG
+        [Authorize(Roles = "IES")]
+#endif
+        public async Task<IActionResult> GetTeacCount(JsonElement request)
+        {
+            try
+            {
+                if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
+                var db = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School");
+                var r8 = _azureRedis.GetRedisClient(8);
+
+                List<SchoolProductSerial> serial = new(); //承接DB資料用:序號
+                List<deviceForCoreService> uuidList = new(); //要向CoreService詢問deviceID及硬體資訊的UUID列表
+                long UTCNow = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
+
+                //軟體
+                List<string> serialPermitList = getSerialPermitProdcodeList();
+                string serialPermitJsonStr = JsonConvert.SerializeObject(serialPermitList);
+                string serialQueryText = $"SELECT * FROM c WHERE c.dataType = 'serial' AND ARRAY_CONTAINS({serialPermitJsonStr}, c.prodCode)";
+                await foreach (var itemsr in db.GetItemQueryStreamIterator(queryText: serialQueryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Product-{school_code}") }))
+                {
+                    using var json = await JsonDocument.ParseAsync(itemsr.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                    {
+                        deviceForCoreService uuidForCore;
+                        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                        {
+                            serial.Add(obj.ToObject<SchoolProductSerial>());
+                            if (obj.TryGetProperty("deviceBound", out JsonElement deviceBoundJobj) && !string.IsNullOrWhiteSpace(deviceBoundJobj.ToString()))
+                            {
+                                foreach (var deviceBoundTmpRow in deviceBoundJobj.EnumerateArray())
+                                {
+                                    uuidForCore = new deviceForCoreService
+                                    {
+                                        sn = (!string.IsNullOrWhiteSpace(Convert.ToString(obj.GetProperty("serial")))) ? Convert.ToString(obj.GetProperty("serial")) : null,
+                                        uuid1 = (!string.IsNullOrWhiteSpace(Convert.ToString(deviceBoundTmpRow.GetProperty("uuid")))) ? Convert.ToString(deviceBoundTmpRow.GetProperty("uuid")) : null,
+                                        uuid2 = (!string.IsNullOrWhiteSpace(Convert.ToString(deviceBoundTmpRow.GetProperty("uuid2")))) ? Convert.ToString(deviceBoundTmpRow.GetProperty("uuid2")) : null,
+                                        device_id = (!string.IsNullOrWhiteSpace(Convert.ToString(deviceBoundTmpRow.GetProperty("deviceId")))) ? Convert.ToString(deviceBoundTmpRow.GetProperty("deviceId")) : null,
+                                        class_id = (!string.IsNullOrWhiteSpace(Convert.ToString(deviceBoundTmpRow.GetProperty("classId")))) ? Convert.ToString(deviceBoundTmpRow.GetProperty("classId")) : null
+                                    };
+                                    uuidList.Add(uuidForCore);
+                                }
+                            }
+                        }
+                    }
+                }
+                ////取得DeviceInfo From Core 並更新序號資料
+                List<deviceFromCoreService> coreUuidList = (List<deviceFromCoreService>)GetDeviceFromCoreAsync(uuidList).GetAwaiter().GetResult();
+                List<deviceBoundExt> deviceBoundArray;
+                List<deviceBoundExt> counts = new();
+                List<deviceFromCoreService> coreUuid;
+                deviceForCoreService deviceBoundRow;
+                deviceBoundExt deviceBoundExt;
+                List<SchoolProductSerial> updSchoolProductSerialList = new List<SchoolProductSerial>(); //更新學校產品序號用
+                foreach (SchoolProductSerial serialRow in serial)
+                {
+                    deviceBoundArray = new List<deviceBoundExt>();
+                    coreUuid = coreUuidList
+                           .Where((deviceFromCoreService x) => x.sn == serialRow.serial)
+                           .ToList();
+                    foreach (deviceFromCoreService deviceRow in coreUuid)
+                    {
+                        if (!string.IsNullOrWhiteSpace(deviceRow.uuid1) || !string.IsNullOrWhiteSpace(deviceRow.uuid2) || !string.IsNullOrWhiteSpace(deviceRow.device_id)) //uuid1、uuid2、device_id 任一欄有值
+                        {
+                            //前端顯示用
+                            deviceBoundRow = uuidList.Where(u => u.sn == deviceRow.sn && u.uuid1 == deviceRow.uuid1 && u.uuid2 == deviceRow.uuid2).FirstOrDefault();
+                            deviceBoundExt = new deviceBoundExt
+                            {
+                                uuid = deviceBoundRow.uuid1,
+                                uuid2 = deviceBoundRow.uuid2,
+                                classId = deviceBoundRow.class_id,
+                                deviceId = deviceRow.device_id,
+                                os = deviceRow.os,
+                                ip = deviceRow.local_ip,
+                                cpu = deviceRow.cpu,
+                                pcname = deviceRow.pc_name,
+                                osver = deviceRow.os_ver
+                            };
+                            deviceBoundArray.Add(deviceBoundExt);                         
+                        }
+                    }
+                    if (deviceBoundArray.Count.Equals(0)) //無法取得CS的硬體資訊,則用序號的硬體資訊帶入
+                    {
+                        if (serialRow.deviceBound != null)
+                        {
+                            foreach (deviceBound serialRowDeviceBound in serialRow.deviceBound)
+                            {
+                                if (!string.IsNullOrEmpty(serialRowDeviceBound.uuid) || !string.IsNullOrEmpty(serialRowDeviceBound.uuid2))
+                                {
+                                    deviceBoundExt = new deviceBoundExt
+                                    {
+                                        uuid = serialRowDeviceBound.uuid,
+                                        uuid2 = serialRowDeviceBound.uuid2,
+                                        classId = serialRowDeviceBound.classId,
+                                        deviceId = serialRowDeviceBound.deviceId
+                                    };
+                                    deviceBoundArray.Add(deviceBoundExt);
+                                }
+                            }
+                        }
+                    }
+                    //序號更新
+                   //updSchoolProductSerialList.Add(serialRow);
+                   counts.AddRange(deviceBoundArray);
+                    //await db.ReplaceItemAsync<SchoolProductSerial>(serialRow, serialRow.id, new PartitionKey($"Product-{school_code}"));
+                }                    
+                //取得CC授權使用狀態
+                var hashs = await r8.HashGetAllAsync($"CC:License:{school_code.GetString()}");
+                var ccuser = hashs.Select(x => JsonDocument.Parse(x.Value.ToString())).ToList();
+
+                //更新學校產品序號
+                //_ = UpdupdSchoolProductSerialListAsync(updSchoolProductSerialList, school_code.GetString());
+                double Teachs = counts.Count + ccuser.Count;
+                return Ok(new { Teachs });
+            }
+            catch (Exception ex)
+            {
+                return BadRequest();
+            }
+        }
+
         //集體變更學校序號產品 (效能增進對策)
         //集體變更學校序號產品 (效能增進對策)
         private async Task UpdupdSchoolProductSerialListAsync(List<SchoolProductSerial> serialList, string schoolCode)
         private async Task UpdupdSchoolProductSerialListAsync(List<SchoolProductSerial> serialList, string schoolCode)
         {
         {