Browse Source

1. 調整(三)新增成績統計API-新增排序功能
2. 調整(二)查詢成績統計首頁表資料-新增排序功能
3. 新增(十四)更新成績統計順序API
4. 調整(七)新增自訂項目及其子項目資料-新增排序功能

upon 1 year ago
parent
commit
7fd8122fa4

+ 45 - 0
TEAMModelOS.SDK/Models/Cosmos/School/ScoreCalc.cs

@@ -56,6 +56,10 @@ namespace TEAMModelOS.SDK.Models.Cosmos.School
         /// 總覽分項權重類型 count:加權 | percentage:百分比
         /// </summary>
         public string rateType { get; set; }
+        /// <summary>
+        /// 排序
+        /// </summary>
+        public int sort { get; set; }
     }
     /// <summary>
     /// 成績計算總覽分項-活動基底Class
@@ -95,6 +99,10 @@ namespace TEAMModelOS.SDK.Models.Cosmos.School
         /// </summary>
         public List<double> itemRates { get; set; }
         /// <summary>
+        /// 排序
+        /// </summary>
+        public int sort { get; set; }
+        /// <summary>
         /// 各活動權重類型 count:加權 | percentage:百分比
         /// </summary>
         //public string itemRateType { get; set; }
@@ -302,6 +310,10 @@ namespace TEAMModelOS.SDK.Models.Cosmos.School
         /// 是否使用(是否被勾選) true:使用
         /// </summary>
         public bool use { get; set; }
+        /// <summary>
+        /// 排序
+        /// </summary>
+        public int sort { get; set; }
     }
     /// <summary>
     /// 老師成績計算公式 code:"ScoreCalcFunc-{TMID}"
@@ -914,7 +926,40 @@ namespace TEAMModelOS.SDK.Models.Cosmos.School
         /// 成績統計名稱
         /// </summary>
         public string name { get; set; }
+        /// <summary>
+        /// 排序
+        /// </summary>
+        public int sort { get; set; }
     }
+    #region (十四)更新成績統計順序
+    /// <summary>
+    /// 更新成績統計順序Request
+    /// </summary>
+    public class UpdateCalcSortRq
+    {
+        /// <summary>
+        /// teammodelId
+        /// </summary>
+        public string teammodelId { get; set; }
+        /// <summary>
+        /// 成績統計要更新的資料list
+        /// </summary>
+        public List<CalcSort> calcSorts { get; set; }
+    }
+
+    public class CalcSort
+    {
+        /// <summary>
+        /// 成績統計id
+        /// </summary>
+        public string id { get; set; }
+        /// <summary>
+        /// 排序
+        /// </summary>
+        public int sort { get; set; }
+    }
+    #endregion
+
     #endregion
 
     #endregion

+ 93 - 2
TEAMModelOS/Controllers/Both/ScoreCalcController.cs

@@ -10,11 +10,13 @@ using DocumentFormat.OpenXml.Office2010.Excel;
 using DocumentFormat.OpenXml.Office2016.Excel;
 using DocumentFormat.OpenXml.Presentation;
 using DocumentFormat.OpenXml.Spreadsheet;
+using DocumentFormat.OpenXml.VariantTypes;
 using DocumentFormat.OpenXml.Wordprocessing;
 using FastJSON;
 using HTEXLib.COMM.Helpers;
 using HTEXLib.Helpers.ShapeHelpers;
 using MathNet.Numerics.Distributions;
+using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
@@ -100,6 +102,7 @@ namespace TEAMModelOS.Controllers
 
         //新建成績結算
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("upsert-scorecalc")]
         //[Authorize(Roles = "IES")]
         //[AuthToken(Roles = "admin,teacher,student")]
@@ -194,6 +197,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("get-scorecalc-list")]
         public async Task<IActionResult> GetSscoreCalcList(JsonElement request)
         {
@@ -213,12 +217,12 @@ namespace TEAMModelOS.Controllers
                     }
                     else 
                     {                       
-                      sql = $"SELECT c.id, c.name  FROM c where  c.courseId = '{courseId}' and c.grouplistId = '{grouplistId}' ";
+                      sql = $"SELECT c.id, c.name, c.sort  FROM c where  c.courseId = '{courseId}' and c.grouplistId = '{grouplistId}' order by c.sort Desc ";
                     }
                 }
                 else 
                 {
-                    sql = $"SELECT c.id, c.name  FROM c where  c.courseId = '{courseId}' and c.classId = '{classId}' ";
+                    sql = $"SELECT c.id, c.name, c.sort  FROM c where  c.courseId = '{courseId}' and c.classId = '{classId}' order by c.sort Desc  ";
                 }
                 var client = _azureCosmos.GetCosmosClient();
 
@@ -248,6 +252,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("get-scorecalc-All")]
         public async Task<IActionResult> GetSscoreCalcAll(JsonElement request)
         {
@@ -425,6 +430,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("add-scorecalc")]
         public async Task<IActionResult> AddSscoreCalc(JsonElement request)
         {
@@ -489,7 +495,24 @@ namespace TEAMModelOS.Controllers
                 scoreCalcBase.rateType = "percentage";
                 scoreCalcBase.id = Guid.NewGuid().ToString();
                 scoreCalcBase.code = scoreCalcBase.pk + "-" + teammodelId;
+                //取得目前成績統計總數
+                int count = 0;
+                string sql = "";
+                if (!ishaveClassId)
+                {
+                    sql = $"SELECT c.id  FROM c where  c.courseId = '{courseId}' and c.grouplistId = '{grouplistId}' ";
+                }
+                else
+                {
+                    sql = $"SELECT c.id  FROM c where  c.courseId = '{courseId}' and c.classId = '{classId}' ";
+                }
+                await foreach (var item in clientTeacher.GetItemQueryIterator<ItemId>(queryText: sql))
+                {
+                    count++;
+                }
+                scoreCalcBase.sort = count + 1;
                 scoreCalcBase = await clientTeacher.CreateItemAsync(scoreCalcBase, new PartitionKey($"{scoreCalcBase.code}"));
+                
 
                 #endregion
 
@@ -511,9 +534,11 @@ namespace TEAMModelOS.Controllers
                 for (int j = 0; j < scoreCalcLsRecord.items.Count; j++)
                 {
                     scoreCalcLsRecord.itemRates.Add(1);
+                    scoreCalcLsRecord.items[j].sort = j + 1;
                 }
                 scoreCalcLsRecord.editScores = editScores;
                 scoreCalcLsRecord.code = scoreCalcLsRecord.pk + "-" + teammodelId;
+                scoreCalcLsRecord.sort = 1;
                 scoreCalcLsRecord = await clientTeacher.CreateItemAsync(scoreCalcLsRecord, new PartitionKey($"{scoreCalcLsRecord.code}"));
                 //scoreCalcAct.Add(scoreCalcLsRecord);
 
@@ -525,10 +550,12 @@ namespace TEAMModelOS.Controllers
                 scoreCalcActivity_eaxm.name = "評量活動";
                 scoreCalcActivity_eaxm.type = "exam";
                 scoreCalcActivity_eaxm.rate = 30;
+                scoreCalcActivity_eaxm.sort = 2;
 
                 for (int j = 0; j < scoreCalcActivity_eaxm.items.Count; j++)
                 {
                     scoreCalcActivity_eaxm.itemRates.Add(1);
+                    scoreCalcActivity_eaxm.items[j].sort = j + 1;
                 }
                 scoreCalcActivity_eaxm.editScores = editScores;
                 scoreCalcActivity_eaxm.code = scoreCalcActivity_eaxm.pk + "-" + teammodelId;
@@ -543,10 +570,12 @@ namespace TEAMModelOS.Controllers
                 scoreCalcActivity_homework.name = "作業活動";
                 scoreCalcActivity_homework.type = "homework";
                 scoreCalcActivity_homework.rate = 30;
+                scoreCalcActivity_homework.sort = 3;
 
                 for (int j = 0; j < scoreCalcActivity_homework.items.Count; j++)
                 {
                     scoreCalcActivity_homework.itemRates.Add(1);
+                    scoreCalcActivity_homework.items[j].sort = j + 1;
                 }
                 scoreCalcActivity_homework.editScores = editScores;
                 scoreCalcActivity_homework.code = scoreCalcActivity_homework.pk + "-" + teammodelId;
@@ -680,6 +709,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("update-scorecalc")]
         public async Task<IActionResult> UpdateSscoreCalc(JsonElement request)
         {
@@ -753,6 +783,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("delete-scorecalc")]
         public async Task<IActionResult> DeleteSscoreCalc(JsonElement request)
         {
@@ -817,6 +848,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("update-formula")]
         public async Task<IActionResult> UpdateFormula(JsonElement request)
         {
@@ -914,6 +946,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("add-scorecalcact")]
         public async Task<IActionResult> AddScoreCalcAct(JsonElement request)
         {
@@ -935,6 +968,7 @@ namespace TEAMModelOS.Controllers
                 scoreCalcActivityItems.id = Guid.NewGuid().ToString();
                 scoreCalcActivityItems.name = "自訂項目名稱";
                 scoreCalcActivityItems.use = true;
+                scoreCalcActivityItems.sort = 1;
                 scoreCalcActivity.items.Add(scoreCalcActivityItems);
                 // 根據學生數量設定預設值
                 List<double> zeroScores = new List<double>();
@@ -950,6 +984,15 @@ namespace TEAMModelOS.Controllers
                 scoreCalcActivity.rate = 10;
                 scoreCalcActivity.editScores = zeroScores;
                 scoreCalcActivity.itemRates = new List<double>() { 1 };
+
+                //取得目前項目總數
+                int count = 0;
+                string sql = $"SELECT c.id  FROM c where c.scorecalcId = '{scorecalcId.ToString()}' ";               
+                await foreach (var item in clientTeacher.GetItemQueryIterator<ItemId>(queryText: sql))
+                {
+                    count++;
+                }            
+                scoreCalcActivity.sort = count + 1;
                 // 新增項目及子項目
                 scoreCalcActivity = await clientTeacher.CreateItemAsync(scoreCalcActivity, new PartitionKey($"{scoreCalcActivity.code}"));
                 #endregion
@@ -987,6 +1030,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("add-scorecalcact-item")]
         public async Task<IActionResult> AddScoreCalcActItem(JsonElement request)
         {
@@ -1079,6 +1123,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("update-scorecalcact")]
         public async Task<IActionResult> UpdateScoreCalcAct(JsonElement request)
         {
@@ -1130,6 +1175,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("delete-scorecalcact")]
         public async Task<IActionResult> DeleteSscoreCalcAct(JsonElement request)
         {
@@ -1171,6 +1217,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("delete-scorecalcactitem")]
         public async Task<IActionResult> DeleteSscoreCalcItem(JsonElement request)
         {
@@ -1246,6 +1293,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("update-itemscore")]
         public async Task<IActionResult> UpdateItemScore(JsonElement request)
         {
@@ -1313,6 +1361,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
         [HttpPost("export-orgscore")]
         public async Task<IActionResult> ExportOrgScore(JsonElement request)
         {
@@ -1917,5 +1966,47 @@ namespace TEAMModelOS.Controllers
             #endregion
             return true;
         }
+
+        /// <summary>
+        /// (十四)更新成績統計順序
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
+        [HttpPost("update-scorecalc-sort")]
+        public async Task<IActionResult> UpdateScoreCalcSort(JsonElement request)
+        {
+            try
+            {
+                if (!request.TryGetProperty("teammodelId", out JsonElement teammodelId)) return BadRequest();
+                var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
+                UpdateCalcSortRq updateCalcSortRq = JsonConvert.DeserializeObject<UpdateCalcSortRq>(request.ToString());
+
+
+                for (int i = 0; i < updateCalcSortRq.calcSorts.Count; i++)
+                {
+                    //取主表資料
+                    ScoreCalcBase scoreCalcBase = await clientTeacher.ReadItemAsync<ScoreCalcBase>(updateCalcSortRq.calcSorts[i].id.ToString(), new PartitionKey($"ScoreCalc-{teammodelId}"));
+                    scoreCalcBase.sort = updateCalcSortRq.calcSorts[i].sort;
+                    //更新
+                    await clientTeacher.ReplaceItemAsync(scoreCalcBase, $"{scoreCalcBase.id}", new PartitionKey(scoreCalcBase.code));
+                }
+                
+
+                var result = new
+                {
+                    RtCode = "0",
+                    RtMsg = "OK"
+                };
+
+                return Ok(result);
+            }
+            catch (Exception e)
+            {
+                //await _dingDing.SendBotMsg($"OS,{_option.Location},open-api/upsert()\n{e.Message}\n{e.StackTrace}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
+                return BadRequest();
+            }
+        }
     }
 }