12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012 |
- using Azure;
- using Azure.Core;
- using Azure.Cosmos;
- using Azure.Messaging.ServiceBus;
- using Azure.Storage.Blobs.Models;
- using DinkToPdf;
- using DinkToPdf.Contracts;
- using DocumentFormat.OpenXml.Bibliography;
- 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;
- using Microsoft.Extensions.Configuration;
- using Microsoft.Extensions.Options;
- using Microsoft.International.Converters.PinYinConverter;
- using Microsoft.International.Converters.TraditionalChineseToSimplifiedConverter;
- using Microsoft.OData.Edm;
- using Newtonsoft.Json;
- using NUnit.Framework;
- using NUnit.Framework.Internal;
- using OpenXmlPowerTools;
- using StackExchange.Redis;
- using System;
- using System.Collections;
- using System.Collections.Concurrent;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Net.Http.Json;
- using System.Runtime.Intrinsics.X86;
- using System.Security.Policy;
- using System.Text;
- using System.Text.Json;
- using System.Text.RegularExpressions;
- using System.Threading.Tasks;
- using System.Xml.Linq;
- using TEAMModelOS.Controllers.Analysis;
- using TEAMModelOS.Controllers.Core;
- using TEAMModelOS.Filter;
- using TEAMModelOS.Models;
- using TEAMModelOS.Models.Dto;
- using TEAMModelOS.SDK;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Extension;
- using TEAMModelOS.SDK.Helper.Common.DateTimeHelper;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.Models.Cosmos.Common;
- using TEAMModelOS.SDK.Models.Cosmos.OpenEntity;
- using TEAMModelOS.SDK.Models.Cosmos.School;
- using TEAMModelOS.SDK.Models.Service;
- using TEAMModelOS.SDK.Models.Service.BI;
- using TEAMModelOS.SDK.Services;
- using static Azure.Core.HttpHeader;
- using static TEAMModelOS.Controllers.Learn.HomeworkController;
- using static TEAMModelOS.SDK.Models.Teacher;
- using static TEAMModelOS.SDK.SchoolService;
- namespace TEAMModelOS.Controllers
- {
- [Route("score")]
- [ApiController]
- public class ScoreCalcController : ControllerBase
- {
- private readonly IHttpClientFactory _httpClient;
- public IWebHostEnvironment _environment { get; set; }
- private readonly AzureStorageFactory _azureStorage;
- private readonly AzureRedisFactory _azureRedis;
- private readonly AzureCosmosFactory _azureCosmos;
- private readonly DingDing _dingDing;
- private readonly AzureServiceBusFactory _serviceBus;
- private readonly CoreAPIHttpService _coreAPIHttpService;
- private readonly Option _option;
- private readonly IPSearcher _searcher;
- public IConfiguration _configuration { get; set; }
- private readonly IConverter _converter;
- public ScoreCalcController(IConverter converter, IPSearcher searcher, IOptionsSnapshot<Option> option, CoreAPIHttpService coreAPIHttpService, IHttpClientFactory httpClient, IWebHostEnvironment environment, AzureCosmosFactory azureCosmos, AzureRedisFactory azureRedis, AzureStorageFactory azureStorage, IConfiguration configuration, AzureServiceBusFactory serviceBus, DingDing dingDing)
- {
- _converter = converter;
- _azureCosmos = azureCosmos;
- _azureRedis = azureRedis;
- _azureStorage = azureStorage;
- _dingDing = dingDing;
- _serviceBus = serviceBus; _configuration = configuration;
- _environment = environment;
- _httpClient = httpClient;
- _option = option.Value;
- _coreAPIHttpService = coreAPIHttpService;
- _searcher = searcher;
- }
- //新建成績結算
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("upsert-scorecalc")]
- //[Authorize(Roles = "IES")]
- //[AuthToken(Roles = "admin,teacher,student")]
- public async Task<IActionResult> UpsertScoreCalc(JsonElement json)
- {
- try
- {
- //var client = _azureCosmos.GetCosmosClient();
- ////總覽
- //ScoreCalcBase scoreCalcBase = new ScoreCalcBase();
- //string tmid = "1595321354";
- //scoreCalcBase.id = "8f25d7b4-79bd-4448-baaf-01b0d3d3efd9";
- //scoreCalcBase.name = "測試成績001";
- //scoreCalcBase.code = $"ScoreCalc-{tmid}";
- //scoreCalcBase.courseId = "a6d778e8-e4f0-46a3-850f-c15daedc5d94";
- //scoreCalcBase.classId = "b069d9d4-ef7e-4f3e-ac62-532b11f95b80";
- //ScoreCalcMember member1 = new ScoreCalcMember() { id = "20230001" , name = "學生1" , no = "1"};
- //ScoreCalcMember member2 = new ScoreCalcMember() { id = "20230002", name = "學生2", no = "2" };
- //scoreCalcBase.members.Add(member1);
- //scoreCalcBase.members.Add(member2);
- //scoreCalcBase.scores.Add(65.5);
- //scoreCalcBase.scores.Add(73.8);
- //scoreCalcBase.scoresOrg.Add(66.7);
- //scoreCalcBase.scoresOrg.Add(71.4);
- //scoreCalcBase.rateType = "percentage";
- //await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(scoreCalcBase, new PartitionKey($"ScoreCalc-{tmid}"));
- ////評量
- //ScoreCalcActivity scoreCalcActivity = new ScoreCalcActivity();
- //scoreCalcActivity.id = "bd492c0c-c6d5-472d-9b3a-93196d3a7010";
- //scoreCalcActivity.code = $"ScoreCalcAct-{tmid}";
- //scoreCalcActivity.scorecalcId = "8f25d7b4-79bd-4448-baaf-01b0d3d3efd9";
- //scoreCalcActivity.type = "exam";
- //ScoreCalcActivityItems exam1 = new ScoreCalcActivityItems(); //被選取的第一個評量
- //exam1.id = "af6cc80f-a4be-4a5f-94ff-12c1fd366a8f";
- //exam1.name = "第一次小考";
- //exam1.code = "Exam-1595321354";
- //exam1.scope = "school";
- //exam1.owner = "teacher";
- //exam1.progress = "finish";
- //exam1.sStatus = 1;
- //exam1.source = "1";
- //exam1.createTime = 1623919622766;
- //scoreCalcActivity.items.Add(exam1);
- //ScoreCalcActivityItems exam2 = new ScoreCalcActivityItems(); //被選取的第二個評量
- //exam2.id = "b3f95a17-b839-4b9a-84de-76c83d0e2845";
- //exam2.name = "第二次小考";
- //exam2.code = "Exam-1595321354";
- //exam2.scope = "private";
- //exam2.owner = "teacher";
- //exam2.progress = "finish";
- //exam2.sStatus = 1;
- //exam2.source = "1";
- //exam2.createTime = 1623204312794;
- //scoreCalcActivity.items.Add(exam2);
- //scoreCalcActivity.itemRates.Add(2); //第一個評量權重
- //scoreCalcActivity.itemRates.Add(1); //第二個評量權重
- //scoreCalcActivity.itemRateType = "count";
- //scoreCalcActivity.itemScores.Add(76.2);
- //scoreCalcActivity.itemScores.Add(81.1);
- //scoreCalcActivity.itemScoresOrg.Add(72.6);
- //scoreCalcActivity.itemScoresOrg.Add(80.7);
- ////scoreCalcActivity.score = 78.2;
- ////scoreCalcActivity.scoreOrg = 77.5;
- //scoreCalcActivity.rate = 40; //評量的總加權 = 40%
- //List<double> stuScores = new List<double>() { 70.1, 73.5 }; //第一個學生的所有評量總成績,第二個同學...
- //scoreCalcActivity.stuScores = stuScores;
- //List<double> examScore1 = new List<double>() { 73.2, 69.7 }; //第一個評量,第一位同學73.2 第二位同學69.7
- //scoreCalcActivity.stuActScores.Add(examScore1);
- //List<double> examScore2 = new List<double>() { 81.6, 58.1 }; //第二個評量
- //scoreCalcActivity.stuActScores.Add(examScore2);
- //List<double> examScore1Org = new List<double>() { 73.2, 69.7 };
- //scoreCalcActivity.stuActScoresOrg.Add(examScore1Org);
- //List<double> examScore2Org = new List<double>() { 81.6, 58.1 };
- //scoreCalcActivity.stuActScoresOrg.Add(examScore2Org);
- //await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(scoreCalcActivity, new PartitionKey($"ScoreCalcAct-{tmid}"));
- ////課堂紀錄
- //ScoreCalcLsRecord scoreCalcLsRecord = new ScoreCalcLsRecord();
- return Ok(new { status = 200 });
- }
- catch (Exception ex)
- {
- return BadRequest();
- }
- }
- /// <summary>
- /// (一)查詢成績統計列表
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("get-scorecalc-list")]
- public async Task<IActionResult> GetSscoreCalcList(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("courseId", out JsonElement courseId)) return BadRequest();
- bool ishaveClassId = request.TryGetProperty("classId", out JsonElement classId);
- bool ishaveGrouplistId = request.TryGetProperty("grouplistId", out JsonElement grouplistId);
- string sql = "";
- // classId 跟 grouplistId 兩個必須有一個必填
- if (!ishaveClassId)
- {
- if (!ishaveGrouplistId)
- {
- return BadRequest();
- }
- else
- {
- 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, c.sort FROM c where c.courseId = '{courseId}' and c.classId = '{classId}' order by c.sort Desc ";
- }
- var client = _azureCosmos.GetCosmosClient();
- #region ====資料取得===
-
-
- List<Calc> calcList = new List<Calc>();
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetItemQueryIterator<Calc>(queryText: sql))
- {
- calcList.Add(item);
- }
- #endregion
- return Ok(calcList);
- }
- catch (Exception e)
- {
- //await _dingDing.SendBotMsg($"OS,{_option.Location},open-api/upsert()\n{e.Message}\n{e.StackTrace}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
- return BadRequest();
- }
- }
- /// <summary>
- /// (二)查詢成績統計首頁表資料
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("get-scorecalc-All")]
- public async Task<IActionResult> GetSscoreCalcAll(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
- //var client = _azureCosmos.GetCosmosClient();
- var client = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- #region ====取得學生資料===
- string sql = $"select b.id, b.name, b.no from c join b in c.members where c.id = '{id}'";
- List<ScoreCalcMember> members = new List<ScoreCalcMember>();
- List<Object> scoreCalcAct = new List<Object>();
- List<ScoreCalcFunc> scoreCalcFunc = new List<ScoreCalcFunc>();
- await foreach (var item in client.GetItemQueryIterator<ScoreCalcMember>(queryText: sql))
- {
- members.Add(item);
- }
- #endregion
- #region ====取得非課堂紀錄的項目資料===
- string sql_Items = $"SELECT c.id, c.name, c.type, c.attendRate, c.pointRate, c.itactRate, c.rate, c.items, c.itemRates, c.itemRateType, c.score, c.scoreOrg, c.stuActScores, c.stuActScoresOrg, c.editScores FROM c where c.scorecalcId = '{id}' and c.type <> 'lessonrecord' ";
- List<ScoreCalcActivity> scoreCalcActivity = new List<ScoreCalcActivity>();
- await foreach (var item in client.GetItemQueryIterator<ScoreCalcActivity>(queryText: sql_Items))
- {
- scoreCalcActivity.Add(item);
- }
- #endregion
- #region ====取得課堂紀錄的項目資料===
- string sql_LessonRecordItems = $"SELECT c.id, c.code, c.name, c.type, c.attendRate, c.pointRate, c.itactRate, c.rate, c.items, c.itemRates, c.stuAttendFunctionId, c.stuPointFunctionId, c. stuItactFunctionId, c.stuActAttendOrgVals, c.stuActAttendScores, c.stuActPointOrgVals, c.stuActPointScores, c.stuActItactOrgVals, c.stuActItactScores, c.score, c.scoreOrg, c.stuActScores, c.stuActScoresOrg, c.editScores FROM c where c.scorecalcId = '{id}' and c.type = 'lessonrecord' ";
- List<ScoreCalcLsRecord> scoreCalcLsRecord = new List<ScoreCalcLsRecord>();
- await foreach (var item in client.GetItemQueryIterator<ScoreCalcLsRecord>(queryText: sql_LessonRecordItems))
- {
- scoreCalcLsRecord.Add(item);
- }
- #endregion
- #region ====取得公式的資料===
- string sql_FuncItems = $"SELECT c.id, c.code, c.name, c.scorecalcActId, c.type, c.method, c.template, c.keyvals, c.content from c where c.code = '{scoreCalcLsRecord[0].code.Replace("ScoreCalcAct", "ScoreCalcActFormula")}'";
- await foreach (var item in client.GetItemQueryIterator<ScoreCalcFunc>(queryText: sql_FuncItems))
- {
- scoreCalcFunc.Add(item);
- }
- #endregion
- #region====整理課堂紀錄回傳格式===
- ScoreCalcLsRecordActDto scoreCalcLsRecordActDto = new ScoreCalcLsRecordActDto();
- scoreCalcLsRecordActDto.id = scoreCalcLsRecord[0].id;
- scoreCalcLsRecordActDto.name = scoreCalcLsRecord[0].name;
- scoreCalcLsRecordActDto.type = scoreCalcLsRecord[0].type;
- scoreCalcLsRecordActDto.attendRate = scoreCalcLsRecord[0].attendRate;
- scoreCalcLsRecordActDto.pointRate = scoreCalcLsRecord[0].pointRate;
- scoreCalcLsRecordActDto.itactRate = scoreCalcLsRecord[0].itactRate;
- scoreCalcLsRecordActDto.rate = scoreCalcLsRecord[0].rate;
- scoreCalcLsRecordActDto.stuAttendFunctionId = scoreCalcLsRecord[0].stuAttendFunctionId;
- scoreCalcLsRecordActDto.stuPointFunctionId = scoreCalcLsRecord[0].stuPointFunctionId;
- scoreCalcLsRecordActDto.stuItactFunctionId = scoreCalcLsRecord[0].stuItactFunctionId;
- #region====整理出席狀態資料===
- // 先塞入學生數量的出席狀態物件
- List<AttendStatesCalc> listAttendStatesCalc = new List<AttendStatesCalc>();
- for (int i = 0; i < members.Count; i++)
- {
- AttendStatesCalc attendStatesCalc = new AttendStatesCalc();
- attendStatesCalc.Absent = 0;
- attendStatesCalc.Absent_Sick = 0;
- attendStatesCalc.Absent_Personal = 0;
- attendStatesCalc.Absent_Official = 0;
- listAttendStatesCalc.Add(attendStatesCalc);
- }
- for (int i = 0; i < scoreCalcLsRecord[0].stuActAttendOrgVals.Count; i++)
- {
- for (int j = 0; j < scoreCalcLsRecord[0].stuActAttendOrgVals[i].Count; j++)
- {
- switch (scoreCalcLsRecord[0].stuActAttendOrgVals[i][j])
- {
- //Absent,2(缺席)
- //DayOff,3(請假)
- //Absent_Sick,4(病假)
- //Absent_Personal,5(事假)
- //Absent_Official,6(公假)
- case 2:
- listAttendStatesCalc[j].Absent = listAttendStatesCalc[j].Absent + 1;
- break;
- case 4:
- listAttendStatesCalc[j].Absent_Sick = listAttendStatesCalc[j].Absent_Sick + 1;
- break;
- case 5:
- listAttendStatesCalc[j].Absent_Personal = listAttendStatesCalc[j].Absent_Personal + 1;
- break;
- case 6:
- listAttendStatesCalc[j].Absent_Official = listAttendStatesCalc[j].Absent_Official + 1;
- break;
- }
- }
- }
- #endregion
- scoreCalcLsRecordActDto.attendStates = listAttendStatesCalc;
- for (int i = 0; i < scoreCalcLsRecord[0].items.Count; i++)
- {
- SubActLsRecord subActLsRecord = new SubActLsRecord();
- subActLsRecord.id = scoreCalcLsRecord[0].items[i].id;
- subActLsRecord.name = scoreCalcLsRecord[0].items[i].name;
- // 子項目比重由外層取得
- subActLsRecord.rate = scoreCalcLsRecord[0].itemRates[i];
- subActLsRecord.use = scoreCalcLsRecord[0].items[i].use;
- // 子項目 出席 / 記分板 / 互動 成績由外層取得
- subActLsRecord.stuActAttendScores = scoreCalcLsRecord[0].stuActAttendScores[i];
- subActLsRecord.stuActPointScores = scoreCalcLsRecord[0].stuActPointScores[i];
- subActLsRecord.stuActItactScores = scoreCalcLsRecord[0].stuActItactScores[i];
- scoreCalcLsRecordActDto.items.Add(subActLsRecord);
- }
- scoreCalcLsRecordActDto.editScores = scoreCalcLsRecord[0].editScores;
- scoreCalcAct.Add(scoreCalcLsRecordActDto);
- #endregion
- #region====整理非課堂紀錄回傳格式===
- for (int i = 0; i < scoreCalcActivity.Count; i++)
- {
- ScoreCalcActivityActDto scoreCalcActivityActDto = new ScoreCalcActivityActDto();
- scoreCalcActivityActDto.id = scoreCalcActivity[i].id;
- scoreCalcActivityActDto.name = scoreCalcActivity[i].name;
- scoreCalcActivityActDto.type = scoreCalcActivity[i].type;
- scoreCalcActivityActDto.rate = scoreCalcActivity[i].rate;
- for (int j = 0; j < scoreCalcActivity[i].items.Count; j++)
- {
- SubActActivity subActActivity = new SubActActivity();
- subActActivity.id = scoreCalcActivity[i].items[j].id;
- subActActivity.name = scoreCalcActivity[i].items[j].name;
- // 子項目比重由外層取得
- subActActivity.rate = scoreCalcActivity[i].itemRates[j];
- subActActivity.use = scoreCalcActivity[i].items[j].use;
- subActActivity.scores = scoreCalcActivity[i].stuActScores[j];
- scoreCalcActivityActDto.items.Add(subActActivity);
- }
- scoreCalcActivityActDto.editScores = scoreCalcActivity[i].editScores;
- scoreCalcAct.Add(scoreCalcActivityActDto);
- }
- #endregion
- var result = new
- {
- members = members,
- scoreCalcAct = scoreCalcAct,
- scoreCalcFunc = scoreCalcFunc
- };
- 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();
- }
- }
- /// <summary>
- /// (三)新增成績統計列(包含預設公式)
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("add-scorecalc")]
- public async Task<IActionResult> AddSscoreCalc(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("courseId", out JsonElement courseId)) return BadRequest();
- if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
- bool ishaveClassId = request.TryGetProperty("classId", out JsonElement classId);
- bool ishaveGrouplistId = request.TryGetProperty("grouplistId", out JsonElement grouplistId);
- bool ishaveTeammodelId = request.TryGetProperty("teammodelId", out JsonElement teammodelId);
- bool ishaveSchoolId = request.TryGetProperty("schoolId", out JsonElement schoolId);
- // classId 跟 grouplistId 兩個必須有一個必填
- if (!ishaveClassId)
- {
- if (!ishaveGrouplistId)
- {
- return BadRequest();
- }
- else
- {
- if (!ishaveTeammodelId) return BadRequest();
- }
- }
- else
- {
- if (!ishaveSchoolId) return BadRequest();
- }
- // 設定活動預設值
- ScoreCalcLsRecord scoreCalcLsRecord = new ScoreCalcLsRecord();
- ScoreCalcActivity scoreCalcActivity_eaxm = new ScoreCalcActivity();
- ScoreCalcActivity scoreCalcActivity_homework = new ScoreCalcActivity();
-
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- ////班級
- List<ScoreCalcMember> members = new List<ScoreCalcMember>();
- #region ==== 1~4. 取出系統資料====
- var isOKRequest = await getSystemScoresDate(courseId, scope, classId, grouplistId, teammodelId, schoolId, ishaveClassId, ishaveGrouplistId, members, scoreCalcLsRecord, scoreCalcActivity_eaxm, scoreCalcActivity_homework);
- if (!isOKRequest) { return BadRequest(); }
- //// 根據學生數量設定加減分預設值陣列
- List<double> editScores = new List<double>();
- for (int j = 0; j < members.Count; j++)
- {
- editScores.Add(0);
- }
- #endregion
- #region ==== 5. 寫入成績統計資料====
- #region ==== 5.1 寫入成績統計主表 ScoreCalc====
- ScoreCalcBase scoreCalcBase = new ScoreCalcBase();
- scoreCalcBase.name = "成績統計";
- scoreCalcBase.courseId = courseId.ToString();
- scoreCalcBase.classId = classId.ToString();
- scoreCalcBase.grouplistId = grouplistId.ToString();
- scoreCalcBase.members = members;
- scoreCalcBase.editScores = editScores;
- 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
- #region ==== 5.2 用ScoreCalc的id 寫入成績統計項目表ScoreCalcAct====
- #region ==== 5.2.1 寫入課堂紀錄====
- scoreCalcLsRecord.id = Guid.NewGuid().ToString();
- scoreCalcLsRecord.scorecalcId = scoreCalcBase.id;
- scoreCalcLsRecord.name = "課堂紀錄";
- scoreCalcLsRecord.type = "lessonrecord";
- scoreCalcLsRecord.rate = 40;
- scoreCalcLsRecord.attendRate = 40;
- scoreCalcLsRecord.pointRate = 30;
- scoreCalcLsRecord.itactRate = 30;
- scoreCalcLsRecord.stuAttendFunctionId = Guid.NewGuid().ToString();
- scoreCalcLsRecord.stuPointFunctionId = Guid.NewGuid().ToString();
- scoreCalcLsRecord.stuItactFunctionId = Guid.NewGuid().ToString();
- 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);
- #endregion
- #region ==== 5.2.2 寫入評量活動====
- scoreCalcActivity_eaxm.id = Guid.NewGuid().ToString();
- scoreCalcActivity_eaxm.scorecalcId = scoreCalcBase.id;
- 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;
- scoreCalcActivity_eaxm = await clientTeacher.CreateItemAsync(scoreCalcActivity_eaxm, new PartitionKey($"{scoreCalcActivity_eaxm.code}"));
- //scoreCalcAct.Add(scoreCalcActivity_eaxm);
- #endregion
- #region ==== 5.2.3 寫入作業活動====
- scoreCalcActivity_homework.id = Guid.NewGuid().ToString();
- scoreCalcActivity_homework.scorecalcId = scoreCalcBase.id;
- 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;
- scoreCalcActivity_homework = await clientTeacher.CreateItemAsync(scoreCalcActivity_homework, new PartitionKey($"{scoreCalcActivity_homework.code}"));
- //scoreCalcAct.Add(scoreCalcActivity_homework);
- #endregion
- #endregion
- #region ==== 5.3 用ScoreCalcAct的id 寫入課堂紀錄公式表ScoreCalcActFormula====
- #region ==== 出席-簡單出席計算法====
- ScoreCalcFunc scoreCalcFunc_simpleAttend = new ScoreCalcFunc();
- scoreCalcFunc_simpleAttend.code = scoreCalcFunc_simpleAttend.pk + "-" + teammodelId;
- scoreCalcFunc_simpleAttend.id = scoreCalcLsRecord.stuAttendFunctionId;
- scoreCalcFunc_simpleAttend.name = "簡單出席計算法";
- scoreCalcFunc_simpleAttend.scorecalcActId = scoreCalcLsRecord.id;
- scoreCalcFunc_simpleAttend.type = "lessonrecord";
- scoreCalcFunc_simpleAttend.method = "attend";
- scoreCalcFunc_simpleAttend.template = "simpleAttend";
- scoreCalcFunc_simpleAttend.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "一次扣幾分", val = "5" });
- scoreCalcFunc_simpleAttend.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "Absent_Sick", val = "true" });
- scoreCalcFunc_simpleAttend.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "Absent", val = "true" });
- scoreCalcFunc_simpleAttend.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "Absent_Personal", val = "true" });
- scoreCalcFunc_simpleAttend.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "Absent_Official", val = "true" });
- scoreCalcFunc_simpleAttend.content = " 100 - ( ( 病假次數 + 缺席次數 + 事假次數 + 公假次數 ) * 一次扣幾分 ) ";
- #endregion
- #region ==== 出席-出席率計算法====
- ScoreCalcFunc scoreCalcFunc_attendRate = new ScoreCalcFunc();
- scoreCalcFunc_attendRate.code = scoreCalcFunc_attendRate.pk + "-" + teammodelId;
- scoreCalcFunc_attendRate.id = Guid.NewGuid().ToString();
- scoreCalcFunc_attendRate.name = "出席率計算法";
- scoreCalcFunc_attendRate.scorecalcActId = scoreCalcLsRecord.id;
- scoreCalcFunc_attendRate.type = "lessonrecord";
- scoreCalcFunc_attendRate.method = "attend";
- scoreCalcFunc_attendRate.template = "attendRate";
- scoreCalcFunc_attendRate.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "每缺席1%扣幾分", val = "1" });
- scoreCalcFunc_attendRate.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "出席率超過%為滿分", val = "90" });
- scoreCalcFunc_attendRate.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "課堂總次數", val = "X" });
- scoreCalcFunc_attendRate.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "Absent_Sick", val = "true" });
- scoreCalcFunc_attendRate.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "Absent", val = "true" });
- scoreCalcFunc_attendRate.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "Absent_Personal", val = "true" });
- scoreCalcFunc_attendRate.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "Absent_Official", val = "true" });
- scoreCalcFunc_attendRate.content = " 100 - ( 出席率超過%為滿分 – ( ( 課堂總次數 - 病假次數 - 缺席次數 - 事假次數 - 公假次數 )/ 課堂總次數 * 100 ) ) * 每缺席1%扣幾分 ";
- #endregion
- #region ==== 記分板-標準化評分====
- ScoreCalcFunc scoreCalcFunc_standard = new ScoreCalcFunc();
- scoreCalcFunc_standard.code = scoreCalcFunc_standard.pk + "-" + teammodelId;
- scoreCalcFunc_standard.id = scoreCalcLsRecord.stuPointFunctionId;
- scoreCalcFunc_standard.name = "標準化評分";
- scoreCalcFunc_standard.scorecalcActId = scoreCalcLsRecord.id;
- scoreCalcFunc_standard.type = "lessonrecord";
- scoreCalcFunc_standard.method = "point";
- scoreCalcFunc_standard.template = "standard";
- scoreCalcFunc_standard.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "原始分數", val = "X" });
- scoreCalcFunc_standard.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "平均分數", val = "Y" });
- scoreCalcFunc_standard.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "平均數", val = "50" });
- scoreCalcFunc_standard.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "標準差", val = "50" });
- scoreCalcFunc_standard.content = " 10 * ( ( 原始分數 - 平均分數 ) / 標準差 ) + 平均數 ";
- #endregion
- #region ==== 記分板-百分比評分====
- ScoreCalcFunc scoreCalcFunc_percent = new ScoreCalcFunc();
- scoreCalcFunc_percent.code = scoreCalcFunc_percent.pk + "-" + teammodelId;
- scoreCalcFunc_percent.id = Guid.NewGuid().ToString();
- scoreCalcFunc_percent.name = "百分比評分";
- scoreCalcFunc_percent.scorecalcActId = scoreCalcLsRecord.id;
- scoreCalcFunc_percent.type = "lessonrecord";
- scoreCalcFunc_percent.method = "point";
- scoreCalcFunc_percent.template = "percent";
- scoreCalcFunc_percent.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "原始分數", val = "X" });
- scoreCalcFunc_percent.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "最高分數", val = "Y" });
- scoreCalcFunc_percent.content = " 100 * ( 原始分數 / 最高分數 )";
- #endregion
- #region ==== 互動-標準化評分====
- ScoreCalcFunc scoreCalcFunc_standard_interaction = new ScoreCalcFunc();
- scoreCalcFunc_standard_interaction.code = scoreCalcFunc_standard_interaction.pk + "-" + teammodelId;
- scoreCalcFunc_standard_interaction.id = scoreCalcLsRecord.stuItactFunctionId;
- scoreCalcFunc_standard_interaction.name = "標準化評分";
- scoreCalcFunc_standard_interaction.scorecalcActId = scoreCalcLsRecord.id;
- scoreCalcFunc_standard_interaction.type = "lessonrecord";
- scoreCalcFunc_standard_interaction.method = "interaction";
- scoreCalcFunc_standard_interaction.template = "standard";
- scoreCalcFunc_standard_interaction.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "原始分數", val = "X" });
- scoreCalcFunc_standard_interaction.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "平均分數", val = "Y" });
- scoreCalcFunc_standard_interaction.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "平均數", val = "50" });
- scoreCalcFunc_standard_interaction.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "標準差", val = "50" });
- scoreCalcFunc_standard_interaction.content = " 10 * ( ( 原始分數 - 平均分數 ) / 標準差 ) + 平均數 ";
- #endregion
- #region ==== 互動-百分比評分====
- ScoreCalcFunc scoreCalcFunc_percent_interaction = new ScoreCalcFunc();
- scoreCalcFunc_percent_interaction.code = scoreCalcFunc_percent_interaction.pk + "-" + teammodelId;
- scoreCalcFunc_percent_interaction.id = Guid.NewGuid().ToString();
- scoreCalcFunc_percent_interaction.name = "百分比評分";
- scoreCalcFunc_percent_interaction.scorecalcActId = scoreCalcLsRecord.id;
- scoreCalcFunc_percent_interaction.type = "lessonrecord";
- scoreCalcFunc_percent_interaction.method = "interaction";
- scoreCalcFunc_percent_interaction.template = "percent";
- scoreCalcFunc_percent_interaction.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "原始分數", val = "X" });
- scoreCalcFunc_percent_interaction.keyvals.Add(new ScoreCalcFuncTemplateKeyval() { key = "最高分數", val = "Y" });
- scoreCalcFunc_percent_interaction.content = " 100 * ( 原始分數 / 最高分數 )";
- #endregion
- scoreCalcFunc_simpleAttend = await clientTeacher.CreateItemAsync(scoreCalcFunc_simpleAttend, new PartitionKey($"{scoreCalcFunc_simpleAttend.code}"));
- scoreCalcFunc_attendRate = await clientTeacher.CreateItemAsync(scoreCalcFunc_attendRate, new PartitionKey($"{scoreCalcFunc_attendRate.code}"));
- scoreCalcFunc_standard = await clientTeacher.CreateItemAsync(scoreCalcFunc_standard, new PartitionKey($"{scoreCalcFunc_standard.code}"));
- scoreCalcFunc_percent = await clientTeacher.CreateItemAsync(scoreCalcFunc_percent, new PartitionKey($"{scoreCalcFunc_percent.code}"));
- scoreCalcFunc_standard_interaction = await clientTeacher.CreateItemAsync(scoreCalcFunc_standard_interaction, new PartitionKey($"{scoreCalcFunc_standard_interaction.code}"));
- scoreCalcFunc_percent_interaction = await clientTeacher.CreateItemAsync(scoreCalcFunc_percent_interaction, new PartitionKey($"{scoreCalcFunc_percent_interaction.code}"));
- #endregion
- #endregion
- var result = new
- {
- id = scoreCalcBase.id
- };
- 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();
- }
- }
- /// <summary>
- /// (四)更新成績統計首頁表資料
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("update-scorecalc")]
- public async Task<IActionResult> UpdateSscoreCalc(JsonElement request)
- {
- List<Object> scoreCalc = new List<object>();
- try
- {
- if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
- if (!request.TryGetProperty("teammodelId", out JsonElement teammodelId)) return BadRequest();
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- UpdateSscoreCalcRq updateSscoreCalcRq = JsonConvert.DeserializeObject<UpdateSscoreCalcRq>(request.ToString());
- // 取主表資料
- ScoreCalcBase scoreCalcBase = await clientTeacher.ReadItemAsync<ScoreCalcBase>(id.ToString(), new PartitionKey($"ScoreCalc-{teammodelId}"));
- scoreCalc.Add(scoreCalcBase);
- #region 更新主表
- scoreCalcBase.name = updateSscoreCalcRq.name;
- scoreCalcBase.editScores = updateSscoreCalcRq.editScores;
- scoreCalcBase = await clientTeacher.ReplaceItemAsync(scoreCalcBase, $"{scoreCalcBase.id}", new PartitionKey(scoreCalcBase.code));
- #endregion
- #region 更新項目表
- for (int i = 0; i < updateSscoreCalcRq.ScoreCalcAct.Count; i++)
- {
- if (updateSscoreCalcRq.ScoreCalcAct[i].type == "lessonrecord")
- {
- // 取課堂紀錄資料
- ScoreCalcLsRecord scoreCalcLsRecord = await clientTeacher.ReadItemAsync<ScoreCalcLsRecord>(updateSscoreCalcRq.ScoreCalcAct[i].id, new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- scoreCalcLsRecord.rate = updateSscoreCalcRq.ScoreCalcAct[i].rate;
- scoreCalcLsRecord.editScores = updateSscoreCalcRq.ScoreCalcAct[i].editScores;
- scoreCalcLsRecord.attendRate = updateSscoreCalcRq.ScoreCalcAct[i].attendRate;
- scoreCalcLsRecord.pointRate = updateSscoreCalcRq.ScoreCalcAct[i].pointRate;
- scoreCalcLsRecord.itactRate = updateSscoreCalcRq.ScoreCalcAct[i].itactRate;
- scoreCalcLsRecord = await clientTeacher.ReplaceItemAsync(scoreCalcLsRecord, $"{scoreCalcLsRecord.id}", new PartitionKey(scoreCalcLsRecord.code));
- }
- else
- {
- // 取其他活動資料
- ScoreCalcActivity scoreCalcActivity = await clientTeacher.ReadItemAsync<ScoreCalcActivity>(updateSscoreCalcRq.ScoreCalcAct[i].id, new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- scoreCalcActivity.rate = updateSscoreCalcRq.ScoreCalcAct[i].rate;
- scoreCalcActivity.editScores = updateSscoreCalcRq.ScoreCalcAct[i].editScores;
- scoreCalcActivity = await clientTeacher.ReplaceItemAsync(scoreCalcActivity, $"{scoreCalcActivity.id}", new PartitionKey(scoreCalcActivity.code));
- }
- }
- #endregion
- 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();
- }
- }
- /// <summary>
- /// (五)刪除成績統計
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("delete-scorecalc")]
- public async Task<IActionResult> DeleteSscoreCalc(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
- if (!request.TryGetProperty("teammodelId", out JsonElement teammodelId)) return BadRequest();
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- List<string> idslist = new List<string>();
- List<string> scorecalcIdslist = new List<string>();
- List<string> formulaIdslist = new List<string>();
- idslist.Add(id.ToString());
- // 取項目表的 Id
- string sql = $"SELECT c.id FROM c where c.scorecalcId = '{id}' ";
- await foreach (var item in clientTeacher.GetItemQueryIterator<ItemId>(queryText: sql))
- {
- scorecalcIdslist.Add(item.id);
- }
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < scorecalcIdslist.Count; i++)
- {
- sb.Append($"'{scorecalcIdslist[i]}',");
- }
- // 取公式表的 id
- string sql_Formula = $"SELECT c.id FROM c where c.scorecalcActId in ({sb.ToString().Remove(sb.Length - 1, 1)}) ";
- await foreach (var item in clientTeacher.GetItemQueryIterator<ItemId>(queryText: sql_Formula))
- {
- formulaIdslist.Add(item.id);
- }
- //刪除主表 用傳進來的主表id 刪除資料
- var response = await clientTeacher.DeleteItemStreamAsync(id.ToString(), new PartitionKey($"ScoreCalc-{teammodelId}"));
- //await clientTeacher.DeleteItemsStreamAsync(idslist, $"ScoreCalc-{teammodelId}");
- //刪除項目表
- await clientTeacher.DeleteItemsStreamAsync(scorecalcIdslist, $"ScoreCalcAct-{teammodelId}");
- //刪除公式表
- await clientTeacher.DeleteItemsStreamAsync(formulaIdslist, $"ScoreCalcActFormula-{teammodelId}");
- 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();
- }
- }
- /// <summary>
- /// (六)更新公式設定(一次可以處理多個公式)
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("update-formula")]
- public async Task<IActionResult> UpdateFormula(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("scoreCalcActId", out JsonElement scoreCalcActId)) return BadRequest();
- if (!request.TryGetProperty("teammodelId", out JsonElement teammodelId)) return BadRequest();
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- UpdateFormulaRq updateFormulaRq = JsonConvert.DeserializeObject<UpdateFormulaRq>(request.ToString());
- List<ScoreCalcFunc> scoreCalcFuncs = new List<ScoreCalcFunc>();
- // 取公式表的 資料
- string sql = $"SELECT * FROM c where c.scorecalcActId = '{scoreCalcActId}' ";
- await foreach (var item in clientTeacher.GetItemQueryIterator<ScoreCalcFunc>(queryText: sql))
- {
- scoreCalcFuncs.Add(item);
- }
- // 比對資料 決定哪些公式及項目表要更新
- for (int i = 0; i < updateFormulaRq.scoreCalcFunc.Count; i++)
- {
- #region 更新項目表公式id
- if (updateFormulaRq.scoreCalcFunc[i].use)
- {
- // 更新項目使用的公式id
- // 取課堂紀錄資料
- // ToDo...以後可能需要其他活動也可以用公式
- ScoreCalcLsRecord scoreCalcLsRecord = await clientTeacher.ReadItemAsync<ScoreCalcLsRecord>(updateFormulaRq.scoreCalcActId, new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- switch (updateFormulaRq.method)
- {
- case "attend":
- scoreCalcLsRecord.stuAttendFunctionId = updateFormulaRq.scoreCalcFunc[i].id;
- break;
- case "point":
- scoreCalcLsRecord.stuPointFunctionId = updateFormulaRq.scoreCalcFunc[i].id;
- break;
- case "interaction":
- scoreCalcLsRecord.stuItactFunctionId = updateFormulaRq.scoreCalcFunc[i].id;
- break;
- }
- scoreCalcLsRecord = await clientTeacher.ReplaceItemAsync(scoreCalcLsRecord, $"{scoreCalcLsRecord.id}", new PartitionKey(scoreCalcLsRecord.code));
- }
- #endregion
- #region 更新 or 新增公式
- for (int j = 0; j < scoreCalcFuncs.Count; j++)
- {
- if (updateFormulaRq.scoreCalcFunc[i].id == scoreCalcFuncs[j].id)
- {// 如果公式Id有代入 則更新公式
- // 取公式資料
- scoreCalcFuncs[j].name = updateFormulaRq.scoreCalcFunc[i].name;
- scoreCalcFuncs[j].keyvals = updateFormulaRq.scoreCalcFunc[i].keyvals;
- scoreCalcFuncs[j].content = updateFormulaRq.scoreCalcFunc[i].content;
- scoreCalcFuncs[j] = await clientTeacher.ReplaceItemAsync(scoreCalcFuncs[j], $"{scoreCalcFuncs[j].id}", new PartitionKey(scoreCalcFuncs[j].code));
- }
- }
- if (updateFormulaRq.scoreCalcFunc[i].id == "")
- {// 如果公式Id沒有代入 則新增公式
- ScoreCalcFunc scoreCalcFunc = new ScoreCalcFunc();
- scoreCalcFunc.code = $"ScoreCalcActFormula-{teammodelId}";
- scoreCalcFunc.id = Guid.NewGuid().ToString();
- scoreCalcFunc.name = updateFormulaRq.scoreCalcFunc[i].name;
- scoreCalcFunc.scorecalcActId = updateFormulaRq.scoreCalcActId;
- // ToDo...以後可能需要其他活動也可以用公式
- scoreCalcFunc.type = "lessonrecord";
- scoreCalcFunc.method = updateFormulaRq.method;
- scoreCalcFunc.template = updateFormulaRq.scoreCalcFunc[i].template;
- scoreCalcFunc.keyvals = updateFormulaRq.scoreCalcFunc[i].keyvals;
- scoreCalcFunc.content = updateFormulaRq.scoreCalcFunc[i].content;
- scoreCalcFunc = await clientTeacher.CreateItemAsync(scoreCalcFunc, new PartitionKey($"{scoreCalcFunc.code}"));
- }
- #endregion
- }
- 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();
- }
- }
- /// <summary>
- ///(七)新增自訂項目及其子項目資料
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("add-scorecalcact")]
- public async Task<IActionResult> AddScoreCalcAct(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("scorecalcId", out JsonElement scorecalcId)) return BadRequest();
- if (!request.TryGetProperty("teammodelId", out JsonElement teammodelId)) return BadRequest();
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- // 取主表資料
- ScoreCalcBase scoreCalcBase = await clientTeacher.ReadItemAsync<ScoreCalcBase>(scorecalcId.ToString(), new PartitionKey($"ScoreCalc-{teammodelId}"));
- #region 寫入DB 新增自訂項目及其子項目資料
- // 設定預設值
- ScoreCalcActivity scoreCalcActivity = new ScoreCalcActivity();
- scoreCalcActivity.id = Guid.NewGuid().ToString();
- scoreCalcActivity.code = $"ScoreCalcAct-{teammodelId}";
- ScoreCalcActivityItems scoreCalcActivityItems = new ScoreCalcActivityItems();
- scoreCalcActivityItems.id = Guid.NewGuid().ToString();
- scoreCalcActivityItems.name = "自訂項目名稱";
- scoreCalcActivityItems.use = true;
- scoreCalcActivityItems.sort = 1;
- scoreCalcActivity.items.Add(scoreCalcActivityItems);
- // 根據學生數量設定預設值
- List<double> zeroScores = new List<double>();
- for (int j = 0; j < scoreCalcBase.members.Count; j++)
- {
- zeroScores.Add(0);
- }
- scoreCalcActivity.stuActScores.Add(zeroScores);
- scoreCalcActivity.stuActScoresOrg.Add(zeroScores);
- scoreCalcActivity.scorecalcId = scorecalcId.ToString();
- scoreCalcActivity.name = "自訂活動名稱";
- scoreCalcActivity.type = "custom";
- 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
- #region 組合回傳格式
- ScoreCalcActivityActDto scoreCalcActivityActDto = new ScoreCalcActivityActDto();
- scoreCalcActivityActDto.id = scoreCalcActivity.id;
- scoreCalcActivityActDto.name = scoreCalcActivity.name;
- scoreCalcActivityActDto.type = scoreCalcActivity.type;
- scoreCalcActivityActDto.rate = scoreCalcActivity.rate;
- SubActActivity subActActivity = new SubActActivity();
- subActActivity.id = scoreCalcActivity.items[0].id;
- subActActivity.name = scoreCalcActivity.items[0].name;
- // 子項目比重由外層取得
- subActActivity.rate = scoreCalcActivity.itemRates[0];
- subActActivity.use = scoreCalcActivity.items[0].use;
- subActActivity.scores = scoreCalcActivity.stuActScores[0];
- scoreCalcActivityActDto.items.Add(subActActivity);
- scoreCalcActivityActDto.editScores = scoreCalcActivity.editScores;
- #endregion
- return Ok(scoreCalcActivityActDto);
- }
- catch (Exception e)
- {
- //await _dingDing.SendBotMsg($"OS,{_option.Location},open-api/upsert()\n{e.Message}\n{e.StackTrace}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
- return BadRequest();
- }
- }
- /// <summary>
- ///(八)新增子項目
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("add-scorecalcact-item")]
- public async Task<IActionResult> AddScoreCalcActItem(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("scoreCalcActId", out JsonElement scoreCalcActId)) return BadRequest();
- if (!request.TryGetProperty("teammodelId", out JsonElement teammodelId)) return BadRequest();
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- // 取項目表資料
- ScoreCalcActivityBase scoreCalcActivityBase = await clientTeacher.ReadItemAsync<ScoreCalcActivityBase>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- // 取主表資料
- ScoreCalcBase scoreCalcBase = await clientTeacher.ReadItemAsync<ScoreCalcBase>(scoreCalcActivityBase.scorecalcId.ToString(), new PartitionKey($"ScoreCalc-{teammodelId}"));
- // 根據學生數量設定預設值
- List<double> zeroScores = new List<double>();
- for (int j = 0; j < scoreCalcBase.members.Count; j++)
- {
- zeroScores.Add(0);
- }
- // 設定子項目的預設值
- ScoreCalcActivityItems scoreCalcActivityItems = new ScoreCalcActivityItems();
- scoreCalcActivityItems.id = Guid.NewGuid().ToString();
- scoreCalcActivityItems.name = "自訂項目名稱";
- scoreCalcActivityItems.use = true;
- // 先判斷是否為課堂紀錄 根據項目的類別寫入的欄位需要調整
- if (scoreCalcActivityBase.type == "lessonrecord")
- {
- ScoreCalcLsRecord scoreCalcLsRecord = await clientTeacher.ReadItemAsync<ScoreCalcLsRecord>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- scoreCalcLsRecord.items.Add(scoreCalcActivityItems);
- scoreCalcLsRecord.stuActAttendOrgVals.Add(zeroScores);
- scoreCalcLsRecord.stuActAttendScores.Add(zeroScores);
- scoreCalcLsRecord.stuActPointOrgVals.Add(zeroScores);
- scoreCalcLsRecord.stuActPointScores.Add(zeroScores);
- scoreCalcLsRecord.stuActItactOrgVals.Add(zeroScores);
- scoreCalcLsRecord.stuActItactScores.Add(zeroScores);
- scoreCalcLsRecord.itemRates.Add(1);
- scoreCalcLsRecord = await clientTeacher.ReplaceItemAsync(scoreCalcLsRecord, $"{scoreCalcLsRecord.id}", new PartitionKey(scoreCalcLsRecord.code));
- #region 組合回傳格式
- SubActLsRecord subActLsRecord = new SubActLsRecord();
- subActLsRecord.id = scoreCalcLsRecord.items[scoreCalcLsRecord.items.Count - 1].id;
- subActLsRecord.name = scoreCalcLsRecord.items[scoreCalcLsRecord.items.Count - 1].name;
- subActLsRecord.rate = scoreCalcLsRecord.itemRates[scoreCalcLsRecord.itemRates.Count - 1];
- subActLsRecord.use = scoreCalcLsRecord.items[scoreCalcLsRecord.items.Count - 1].use;
- subActLsRecord.stuActAttendScores = scoreCalcLsRecord.stuActAttendScores[scoreCalcLsRecord.stuActAttendScores.Count - 1];
- subActLsRecord.stuActPointScores = scoreCalcLsRecord.stuActPointScores[scoreCalcLsRecord.stuActPointScores.Count - 1];
- subActLsRecord.stuActItactScores = scoreCalcLsRecord.stuActItactScores[scoreCalcLsRecord.stuActItactScores.Count - 1];
- #endregion
- return Ok(subActLsRecord);
- }
- else
- {
- ScoreCalcActivity scoreCalcActivity = await clientTeacher.ReadItemAsync<ScoreCalcActivity>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- scoreCalcActivity.items.Add(scoreCalcActivityItems);
- scoreCalcActivity.stuActScores.Add(zeroScores);
- scoreCalcActivity.stuActScoresOrg.Add(zeroScores);
- scoreCalcActivity.itemRates.Add(1);
- scoreCalcActivity = await clientTeacher.ReplaceItemAsync(scoreCalcActivity, $"{scoreCalcActivity.id}", new PartitionKey(scoreCalcActivity.code));
- #region 組合回傳格式
- SubActActivity subActActivity = new SubActActivity();
- subActActivity.id = scoreCalcActivity.items[scoreCalcActivity.items.Count - 1].id;
- subActActivity.name = scoreCalcActivity.items[scoreCalcActivity.items.Count - 1].name;
- subActActivity.rate = scoreCalcActivity.itemRates[scoreCalcActivity.itemRates.Count - 1];
- subActActivity.use = scoreCalcActivity.items[scoreCalcActivity.items.Count - 1].use;
- subActActivity.scores = scoreCalcActivity.stuActScores[scoreCalcActivity.stuActScores.Count - 1];
- #endregion
- return Ok(subActActivity);
- }
- }
- catch (Exception e)
- {
- //await _dingDing.SendBotMsg($"OS,{_option.Location},open-api/upsert()\n{e.Message}\n{e.StackTrace}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
- return BadRequest();
- }
- }
- /// <summary>
- /// (九)更新項目及子項目資料
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("update-scorecalcact")]
- public async Task<IActionResult> UpdateScoreCalcAct(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("scoreCalcActId", out JsonElement scoreCalcActId)) return BadRequest();
- if (!request.TryGetProperty("teammodelId", out JsonElement teammodelId)) return BadRequest();
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- // 取項目表資料
- ScoreCalcActivity scoreCalcActivity = await clientTeacher.ReadItemAsync<ScoreCalcActivity>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- UpdateActivityActRq updateActivityActRq = JsonConvert.DeserializeObject<UpdateActivityActRq>(request.ToString());
- //設定需更新的欄位值
- scoreCalcActivity.name = updateActivityActRq.name;
- scoreCalcActivity.rate = updateActivityActRq.rate;
- for (int i = 0; i < scoreCalcActivity.items.Count; i++)
- {
- for (int j = 0; j < updateActivityActRq.items.Count; j++)
- {
- if (scoreCalcActivity.items[i].id == updateActivityActRq.items[j].id)
- {
- scoreCalcActivity.items[i].name = updateActivityActRq.items[j].name;
- scoreCalcActivity.items[i].use = updateActivityActRq.items[j].use;
- scoreCalcActivity.itemRates[i] = updateActivityActRq.items[j].rate;
- }
- }
- }
- //更新
- scoreCalcActivity = await clientTeacher.ReplaceItemAsync(scoreCalcActivity, $"{scoreCalcActivity.id}", new PartitionKey(scoreCalcActivity.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();
- }
- }
- /// <summary>
- ///(十)刪除自訂項目
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("delete-scorecalcact")]
- public async Task<IActionResult> DeleteSscoreCalcAct(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
- if (!request.TryGetProperty("teammodelId", out JsonElement teammodelId)) return BadRequest();
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- ScoreCalcActivityBase scoreCalcActivityBase = await clientTeacher.ReadItemAsync<ScoreCalcActivityBase>(id.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- // 先檢查
- if (scoreCalcActivityBase.type == "lessonrecord" || scoreCalcActivityBase.type == "exam" || scoreCalcActivityBase.type == "homework")
- {
- return BadRequest();
- }
- else
- {
- //刪除項目表
- var response = await clientTeacher.DeleteItemStreamAsync(id.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- 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();
- }
- }
- /// <summary>
- ///(十一)刪除子項目
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("delete-scorecalcactitem")]
- public async Task<IActionResult> DeleteSscoreCalcItem(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("scoreCalcActId", out JsonElement scoreCalcActId)) return BadRequest();
- if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
- if (!request.TryGetProperty("teammodelId", out JsonElement teammodelId)) return BadRequest();
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- // 取項目表資料
- ScoreCalcActivityBase scoreCalcActivityBase = await clientTeacher.ReadItemAsync<ScoreCalcActivityBase>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- var result = new
- {
- RtCode = "0",
- RtMsg = "OK"
- };
- // 先判斷是否為課堂紀錄 根據項目的類別刪除的欄位需要調整
- if (scoreCalcActivityBase.type == "lessonrecord")
- {
- ScoreCalcLsRecord scoreCalcLsRecord = await clientTeacher.ReadItemAsync<ScoreCalcLsRecord>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- // 先尋找要刪除的子項目
- for (int i = 0; i < scoreCalcLsRecord.items.Count; i++)
- {
- if (scoreCalcLsRecord.items[i].id == id.ToString())
- {// 比對中了 移除該項目
- scoreCalcLsRecord.items.Remove(scoreCalcLsRecord.items[i]);
- scoreCalcLsRecord.stuActAttendOrgVals.Remove(scoreCalcLsRecord.stuActAttendOrgVals[i]);
- scoreCalcLsRecord.stuActAttendScores.Remove(scoreCalcLsRecord.stuActAttendScores[i]);
- scoreCalcLsRecord.stuActPointOrgVals.Remove(scoreCalcLsRecord.stuActPointOrgVals[i]);
- scoreCalcLsRecord.stuActPointScores.Remove(scoreCalcLsRecord.stuActPointScores[i]);
- scoreCalcLsRecord.stuActItactOrgVals.Remove(scoreCalcLsRecord.stuActItactOrgVals[i]);
- scoreCalcLsRecord.stuActItactScores.Remove(scoreCalcLsRecord.stuActItactScores[i]);
- scoreCalcLsRecord.itemRates.Remove(scoreCalcLsRecord.itemRates[i]);
- }
- }
- scoreCalcLsRecord = await clientTeacher.ReplaceItemAsync(scoreCalcLsRecord, $"{scoreCalcLsRecord.id}", new PartitionKey(scoreCalcLsRecord.code));
- return Ok(result);
- }
- else
- {
- ScoreCalcActivity scoreCalcActivity = await clientTeacher.ReadItemAsync<ScoreCalcActivity>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- // 先尋找要刪除的子項目
- for (int i = 0; i < scoreCalcActivity.items.Count; i++)
- {
- if (scoreCalcActivity.items[i].id == id.ToString())
- {// 比對中了 移除該項目
- scoreCalcActivity.items.Remove(scoreCalcActivity.items[i]);
- scoreCalcActivity.stuActScores.Remove(scoreCalcActivity.stuActScores[i]);
- scoreCalcActivity.stuActScoresOrg.Remove(scoreCalcActivity.stuActScoresOrg[i]);
- scoreCalcActivity.itemRates.Remove(scoreCalcActivity.itemRates[i]);
- }
- }
- scoreCalcActivity = await clientTeacher.ReplaceItemAsync(scoreCalcActivity, $"{scoreCalcActivity.id}", new PartitionKey(scoreCalcActivity.code));
- 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();
- }
- }
- /// <summary>
- ///(十二)登錄指定子項目成績
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("update-itemscore")]
- public async Task<IActionResult> UpdateItemScore(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("scoreCalcActId", out JsonElement scoreCalcActId)) return BadRequest();
- if (!request.TryGetProperty("teammodelId", out JsonElement teammodelId)) return BadRequest();
- if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- // 取項目表資料Base的部分
- ScoreCalcActivityBase scoreCalcActivityBase = await clientTeacher.ReadItemAsync<ScoreCalcActivityBase>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- // 先判斷是否為課堂紀錄 根據項目的類別刪除的欄位需要調整
- if (scoreCalcActivityBase.type == "lessonrecord")
- {
- UpdateScoreLessonRq updateScoreLessonRq = JsonConvert.DeserializeObject<UpdateScoreLessonRq>(request.ToString());
- // 取課堂紀錄資料
- ScoreCalcLsRecord scoreCalcLsRecord = await clientTeacher.ReadItemAsync<ScoreCalcLsRecord>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- for (int i = 0; i < scoreCalcLsRecord.items.Count; i++)
- {
- if (scoreCalcLsRecord.items[i].id == updateScoreLessonRq.id)
- {
- scoreCalcLsRecord.stuActAttendScores[i] = updateScoreLessonRq.stuActAttendScores;
- scoreCalcLsRecord.stuActPointScores[i] = updateScoreLessonRq.stuActPointScores;
- scoreCalcLsRecord.stuActItactScores[i] = updateScoreLessonRq.stuActItactScores;
- }
- }
- //更新
- scoreCalcLsRecord = await clientTeacher.ReplaceItemAsync(scoreCalcLsRecord, $"{scoreCalcLsRecord.id}", new PartitionKey(scoreCalcLsRecord.code));
- }
- else
- {
- UpdateScoreActivityRq updateScoreActivityRq = JsonConvert.DeserializeObject<UpdateScoreActivityRq>(request.ToString());
- // 取其他活動資料
- ScoreCalcActivity scoreCalcActivity = await clientTeacher.ReadItemAsync<ScoreCalcActivity>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- for (int i = 0; i < scoreCalcActivity.items.Count; i++)
- {
- if (scoreCalcActivity.items[i].id == updateScoreActivityRq.id)
- {
- scoreCalcActivity.stuActScores[i] = updateScoreActivityRq.scores;
- }
- }
- //更新
- scoreCalcActivity = await clientTeacher.ReplaceItemAsync(scoreCalcActivity, $"{scoreCalcActivity.id}", new PartitionKey(scoreCalcActivity.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();
- }
- }
- /// <summary>
- ///(十三)匯出原始成績資料
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("export-orgscore")]
- public async Task<IActionResult> ExportOrgScore(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("courseId", out JsonElement courseId)) return BadRequest();
- if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
- bool ishaveClassId = request.TryGetProperty("classId", out JsonElement classId);
- bool ishaveGrouplistId = request.TryGetProperty("grouplistId", out JsonElement grouplistId);
- bool ishaveTeammodelId = request.TryGetProperty("teammodelId", out JsonElement teammodelId);
- bool ishaveSchoolId = request.TryGetProperty("schoolId", out JsonElement schoolId);
- // classId 跟 grouplistId 兩個必須有一個必填
- if (!ishaveClassId)
- {
- if (!ishaveGrouplistId)
- {
- return BadRequest();
- }
- else
- {
- if (!ishaveTeammodelId) return BadRequest();
- }
- }
- else
- {
- if (!ishaveSchoolId) return BadRequest();
- }
- //班級
- List<ScoreCalcMember> members = new List<ScoreCalcMember>();
- // 設定活動預設值
- ScoreCalcLsRecord scoreCalcLsRecord = new ScoreCalcLsRecord();
- ScoreCalcActivity scoreCalcActivity_eaxm = new ScoreCalcActivity();
- ScoreCalcActivity scoreCalcActivity_homework = new ScoreCalcActivity();
- var isOKRequest = await getSystemScoresDate(courseId, scope, classId, grouplistId, teammodelId, schoolId, ishaveClassId, ishaveGrouplistId, members, scoreCalcLsRecord, scoreCalcActivity_eaxm, scoreCalcActivity_homework);
- if (!isOKRequest) { return BadRequest(); }
- #region 調整資料回傳格式
- List<ExportOrgLsRecordData> exportlessonrecordData = new List<ExportOrgLsRecordData>();
- List<ExportOrgActivityData> exporthomeworkData = new List<ExportOrgActivityData>();
- List<ExportOrgActivityData> exportexamData = new List<ExportOrgActivityData>();
- // 調整課程紀錄回傳格式
- for (int i = 0; i < scoreCalcLsRecord.items.Count; i++)
- {
- ExportOrgLsRecordData exportOrgLsRecordData = new ExportOrgLsRecordData();
- exportOrgLsRecordData.name = scoreCalcLsRecord.items[i].name;
- for (int j = 0; j < members.Count; j++)
- {
- LessonScores lessonScores = new LessonScores();
- lessonScores.id = members[j].id;
- lessonScores.name = members[j].name;
- lessonScores.no = members[j].no;
- lessonScores.attend = scoreCalcLsRecord.stuActAttendOrgVals[i][j];
- lessonScores.point = scoreCalcLsRecord.stuActPointOrgVals[i][j];
- lessonScores.interaction = scoreCalcLsRecord.stuActItactOrgVals[i][j];
- exportOrgLsRecordData.data.Add(lessonScores);
- }
- exportlessonrecordData.Add(exportOrgLsRecordData);
- }
- // 調整評量活動回傳格式
- for (int i = 0; i < scoreCalcActivity_eaxm.items.Count; i++)
- {
- ExportOrgActivityData exportOrgActivityData = new ExportOrgActivityData();
- exportOrgActivityData.name = scoreCalcActivity_eaxm.items[i].name;
- for (int j = 0; j < members.Count; j++)
- {
- ActivityScores activityScores = new ActivityScores();
- activityScores.id = members[j].id;
- activityScores.name = members[j].name;
- activityScores.no = members[j].no;
- activityScores.score = scoreCalcActivity_eaxm.stuActScoresOrg[i][j];
- exportOrgActivityData.data.Add(activityScores);
- }
- exportexamData.Add(exportOrgActivityData);
- }
- // 調整作業活動回傳格式
- for (int i = 0; i < scoreCalcActivity_homework.items.Count; i++)
- {
- ExportOrgActivityData exportOrgActivityData = new ExportOrgActivityData();
- exportOrgActivityData.name = scoreCalcActivity_homework.items[i].name;
- for (int j = 0; j < members.Count; j++)
- {
- ActivityScores activityScores = new ActivityScores();
- activityScores.id = members[j].id;
- activityScores.name = members[j].name;
- activityScores.no = members[j].no;
- activityScores.score = scoreCalcActivity_homework.stuActScoresOrg[i][j];
- exportOrgActivityData.data.Add(activityScores);
- }
- exporthomeworkData.Add(exportOrgActivityData);
- }
- #endregion
- var orgData1 = new
- {
- lessonrecord = exportlessonrecordData,
- homework = exporthomeworkData,
- exam = exportexamData
- };
- return Ok(orgData1);
- }
- catch (Exception e)
- {
- //await _dingDing.SendBotMsg($"OS,{_option.Location},open-api/upsert()\n{e.Message}\n{e.StackTrace}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
- return BadRequest();
- }
- }
- private async Task<bool> getSystemScoresDate(JsonElement courseId, JsonElement scope, JsonElement classId, JsonElement grouplistId, JsonElement teammodelId, JsonElement schoolId, bool ishaveClassId, bool ishaveGrouplistId, List<ScoreCalcMember> members, ScoreCalcLsRecord scoreCalcLsRecord, ScoreCalcActivity scoreCalcActivity_eaxm, ScoreCalcActivity scoreCalcActivity_homework)
- {
- var clientStudent = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student);
- var clientCommon = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common);
- var clientSchool = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School);
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- #region ==== 1~4. 取出系統資料====
- //評量資料
- List<ExamItem> examItem = new List<ExamItem>();
- //評量名稱
- List<ExamItem> examItemName = new List<ExamItem>();
- //作業資料
- List<HomeworkItem> homeworkItems = new List<HomeworkItem>();
- //作業分數
- List<HomeworkItem> homeworkItemsScore = new List<HomeworkItem>();
- #region ==== 1. 取此班級所有學生====
- string sql_members = "";
- if (ishaveClassId)
- {// 如果有classId 直接到student 取資料
- sql_members = $"SELECT c.id, c.no, c.name FROM c WHERE c.classId= '{classId}'";
- await foreach (var item in clientStudent.GetItemQueryIterator<ScoreCalcMember>(queryText: sql_members))
- {
- members.Add(item);
- }
- }
- else if (scope.ToString() == "school")
- {// 選課班 撈School 取id 撈student 取name no
- sql_members = $"SELECT b.id FROM c join b in c.members WHERE c.id= '{grouplistId}'";
- StringBuilder sb = new StringBuilder();
- await foreach (var item in clientSchool.GetItemQueryIterator<ScoreCalcMember>(queryText: sql_members))
- {
- sb.Append($"'{item.id}',");
- }
- if (sb.Length > 0)
- {
- sql_members = $"SELECT c.id, c.no, c.name FROM c WHERE c.id in ({sb.ToString().Remove(sb.Length - 1, 1)})";
- await foreach (var item in clientStudent.GetItemQueryIterator<ScoreCalcMember>(queryText: sql_members))
- {
- members.Add(item);
- }
- }
- }
- else if (scope.ToString() == "private")
- {// 私人班 撈Teacher 取c.id, c.no 撈student 取name
- sql_members = $"SELECT b.id FROM c join b in c.members WHERE c.id= '{grouplistId}'";
- StringBuilder sb = new StringBuilder();
- await foreach (var item in clientTeacher.GetItemQueryIterator<ScoreCalcMember>(queryText: sql_members))
- {
- sb.Append($"'{item.id}',");
- }
- if (sb.Length > 0)
- {
- sql_members = $"SELECT c.id, c.no, c.name FROM c WHERE c.id in ({sb.ToString().Remove(sb.Length - 1, 1)})";
- await foreach (var item in clientStudent.GetItemQueryIterator<ScoreCalcMember>(queryText: sql_members))
- {
- members.Add(item);
- }
- }
- }
- else { return false; }
- //orgData.Add(members);
- #endregion
- #region ==== 2. 取系統課堂紀錄成績====
- #region ==== 取得開課紀錄====
- StringBuilder sql = new StringBuilder();
- sql.Append("select value(c) from c ");
- int pageCount = 1000;
- string sgroupIds = "";
- if (ishaveClassId)
- {
- sgroupIds = classId + "";
- }
- else
- {
- sgroupIds = grouplistId + "";
- }
- JsonElement rqt = System.Text.Json.JsonSerializer.SerializeToElement(new
- {
- tmdid = teammodelId,
- courseId = courseId,
- groupIds = new List<string> { sgroupIds + "" }
- });
- Dictionary<string, object> dict = LessonService.GetLessonCond(rqt);
- string continuationToken = null;
- AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
- string tbname = "";
- string code = "";
- string school = null;
- string sqlPrivate = "";
- List<string> autoTch = new List<string>();
- if (scope.GetString().Equals("school"))
- {
- if (!string.IsNullOrEmpty($"{schoolId}"))
- {
- code = $"LessonRecord-{schoolId}";
- tbname = "School";
- school = $"{schoolId}";
- List<string> ids = new List<string>();
- //只查询某个老师的课例
- if (!string.IsNullOrWhiteSpace($"{teammodelId}"))
- {
- ids.Add($"{teammodelId}");
- }
- else
- {
- string sqltch = "select distinct value(c.id) from c ";
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
- .GetItemQueryIterator<string>(queryText: sqltch, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Teacher-{schoolId}") }))
- {
- ids.Add(item);
- }
- }
- if (ids.Any())
- {
- string sqlTechbase = $"select distinct value(c.id) from c where c.id in ({string.Join(",", ids.Select(x => $"'{x}'"))}) and (array_contains(c.lessonShow,'student') or array_contains(c.lessonShow,'all')) ";
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher)
- .GetItemQueryIterator<string>(queryText: sqlTechbase, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Base") }))
- {
- autoTch.Add(item);
- }
- }
- }
- else
- {
- return false;
- }
- }
- else if ($"{scope}".Equals("private"))
- {
- code = $"LessonRecord";
- tbname = "Teacher";
- if (!string.IsNullOrEmpty($"{teammodelId}"))
- {
- sqlPrivate = $" and c.tmdid='{teammodelId}'";
- List<string> ids = new List<string>();
- ids.Add($"{teammodelId}");
- if (ids.Any())
- {
- string sqlTechbase = $"select distinct value(c.id) from c where c.id in ({string.Join(",", ids.Select(x => $"'{x}'"))}) and (array_contains(c.lessonShow,'student') or array_contains(c.lessonShow,'all')) ";
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher)
- .GetItemQueryIterator<string>(queryText: sqlTechbase, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Base") }))
- {
- autoTch.Add(item);
- }
- }
- }
- else
- {
- //如果不传tmdid, 则必须传递,课程id或者名单列表
- // 如果不传递tmdid
- if (!string.IsNullOrWhiteSpace($"{grouplistId}"))
- {
- return false;
- }
- }
- }
- else
- {
- return false;
- }
- List<LessonRecord> lessonRecords = new List<LessonRecord>();
- try
- {
- string sql_status_managePage = "(c.status<>404 or IS_DEFINED(c.status) = false ) and ";
- cosmosDbQuery.QueryText = cosmosDbQuery.QueryText.Replace("where", $" where {sql_status_managePage} array_length(c.groupIds)>0 {sqlPrivate} and ");
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname)
- .GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, continuationToken: continuationToken,
- requestOptions: new QueryRequestOptions() { MaxItemCount = pageCount, PartitionKey = new PartitionKey(code) }))
- {
- using var json = await JsonDocument.ParseAsync(item.ContentStream);
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- var rcd = obj.ToObject<LessonRecord>();
- if (rcd.hitaClientCmpCount <= 0 && rcd.collateTaskCount > 0)
- {
- rcd.hitaClientCmpCount = rcd.collateTaskCount;
- }
- if (rcd.learningCategory == null)
- {
- rcd.learningCategory = new LearningCategory();
- }
- if (rcd.hitaClientCmpCount > 0)
- {
- rcd.learningCategory.cooperation = 1;
- }
- lessonRecords.Add(rcd);
- }
- continuationToken = item.GetContinuationToken();
- break;
- }
- }
- long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- //查询时处理已经过期的课例。防止ServiceBus未触发的。
- var expireRecords = lessonRecords.Where(x => x.expire > 0 && now > x.expire);
- try
- {
- foreach (var item in expireRecords)
- {
- //item.status = 404;
- //await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync(item, item.id, new PartitionKey(item.code));
- var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
- var messageChange = new ServiceBusMessage(new { delete_id = item.id, tmdid = item.tmdid, scope = item.scope, opt = "delete", school = item.school }.ToJsonString());
- messageChange.ApplicationProperties.Add("name", "LessonRecordEvent");
- await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageChange);
- }
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"{_option.Location},ServiceBus ,LessonRecordEvent 发送消息失败,检查是否配置正常。", GroupNames.成都开发測試群組);
- }
- var tmdids = lessonRecords.Select(x => x.tmdid).ToHashSet();
- if (tmdids != null && tmdids.Count > 0)
- {
- List<IdNameCode> codes = new List<IdNameCode>();
- string sqltmd = $"select c.id,c.name,c.picture from c where c.id in ({string.Join(",", tmdids.Select(x => $"'{x}'"))})";
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<IdNameCode>(queryText: sqltmd, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base") }))
- {
- codes.Add(item);
- }
- if (codes.IsNotEmpty())
- {
- lessonRecords.ForEach(x =>
- {
- var tmd = codes.Find(z => z.id.Equals(x.tmdid));
- if (tmd != null)
- {
- x.tmdname = tmd.name;
- x.tmdpicture = tmd.picture;
- }
- });
- }
- }
- var groupIds = lessonRecords.SelectMany(x => x.groupIds);
- if (groupIds.Any())
- {
- List<GroupListDto> groupLists = await GroupListService.GetGroupListByListids(_azureCosmos.GetCosmosClient(), _dingDing, groupIds.ToList(), school);
- lessonRecords.ForEach(x =>
- {
- List<string> groupNmae = new List<string>();
- x.groupIds.ForEach(y =>
- {
- var dto = groupLists.Find(z => z.id.Equals(y));
- string name = dto != null ? dto.name : "-";
- groupNmae.Add(name);
- });
- x.groupNames = groupNmae;
- });
- }
- //return Ok(new { currCount = lessonRecords.Count, continuationToken, lessonRecords });
- }
- catch (Exception)
- {
- continuationToken = null;
- //return Ok(new { currCount = 0, continuationToken = continuationToken, lessonRecords });
- }
- #endregion
- List<LessonBase> lessonBases = new List<LessonBase>();
- string blobname = "";
- if (ishaveClassId)
- {// 如果有ClassId 要用schoolId去取JSON
- blobname = $"{schoolId}";
- }
- else if (ishaveGrouplistId)
- {// 如果沒有ClassId 要用teammodelId去取JSON
- blobname = $"{teammodelId}";
- }
- foreach (var item in lessonRecords)
- {// 先檢查課堂紀錄是否存在再取資料
- if (_azureStorage.GetBlobContainerClient(blobname).GetBlobClient($"/records/{item.id}/IES/base.json").Exists())
- {
- ScoreCalcActivityItems scoreCalcActivityItems = new ScoreCalcActivityItems();
- scoreCalcActivityItems.id = item.id;
- scoreCalcActivityItems.use = true;
- scoreCalcLsRecord.items.Add(scoreCalcActivityItems);
- BlobDownloadResult baseblobDownload = await _azureStorage.GetBlobContainerClient(blobname).GetBlobClient($"/records/{item.id}/IES/base.json").DownloadContentAsync();
- LessonBase lessonBase = baseblobDownload.Content.ToObjectFromJson<LessonBase>();
- if (lessonBase != null && lessonBase.summary != null)
- {
- lessonBases.Add(lessonBase);
- }
- }
- }
- // 重新比對資料以防 班級人數跟分數的數量對不上
- for (int i = 0; i < lessonBases.Count; i++)
- {
- for (int j = 0; j < lessonBases[i].student.Count; j++)
- {
- for (int k = 0; k < members.Count; k++)
- {
- var find = from data in lessonBases[i].student
- where data.id == members[j].id
- select data;
- if (find.Count() == 0)
- {// 如果學生ID不存在就補0
- lessonBases[i].student.Insert(k, new LessonStudent() { id = members[j].id });
- ClientSummaryList clientSummaryList = new ClientSummaryList();
- clientSummaryList.attendState = 0;
- clientSummaryList.score = 0;
- clientSummaryList.tnteractScore = 0;
- lessonBases[i].report.clientSummaryList.Insert(k, clientSummaryList);
- }
- }
- }
- }
- for (int i = 0; i < lessonBases.Count; i++)
- {
- // 補上寫進DB的子項目名稱欄位
- scoreCalcLsRecord.items[i].name = lessonBases[i].summary.meterialName;
- List<double> stuActAttendScores = new List<double>();
- List<double> stuActPointScores = new List<double>();
- List<double> stuActItactScores = new List<double>();
- if (lessonBases[i].report.clientSummaryList.Count > 0)
- {
- for (int j = 0; j < lessonBases[i].report.clientSummaryList.Count; j++)
- {
- stuActAttendScores.Add(lessonBases[i].report.clientSummaryList[j].attendState);
- stuActPointScores.Add(lessonBases[i].report.clientSummaryList[j].score);
- stuActItactScores.Add(lessonBases[i].report.clientSummaryList[j].tnteractScore);
- }
- }
- // 分數填入
- scoreCalcLsRecord.stuActAttendScores.Add(stuActAttendScores);
- scoreCalcLsRecord.stuActPointScores.Add(stuActPointScores);
- scoreCalcLsRecord.stuActItactScores.Add(stuActItactScores);
- scoreCalcLsRecord.stuActAttendOrgVals.Add(stuActAttendScores);
- scoreCalcLsRecord.stuActPointOrgVals.Add(stuActPointScores);
- scoreCalcLsRecord.stuActItactOrgVals.Add(stuActItactScores);
- }
- #endregion
- #region ==== 3. 取系統評量活動成績====
- string sql_exam = "";
- // 取評量分數
- if (ishaveClassId)
- {
- sql_exam = $"SELECT c.examId, c.studentIds, c.sum FROM c where c.info.id = '{classId}'";
- }
- else
- {
- sql_exam = $"SELECT c.examId, c.studentIds, c.sum FROM c where c.info.id = '{grouplistId}'";
- }
- StringBuilder sb_examIds = new StringBuilder();
- sb_examIds.Append("'',");
- await foreach (var item in clientCommon.GetItemQueryIterator<ExamItem>(queryText: sql_exam))
- {
- examItem.Add(item);
- }
- for (int i = 0; i < examItem.Count; i++)
- {
- sb_examIds.Append($"'{examItem[i].examId}',");
- }
- // 取評量名稱
- string sql_examName = $"SELECT c.name FROM c where c.pk = 'Exam' and c.id in ({sb_examIds.ToString().Remove(sb_examIds.Length - 1, 1)})";
- await foreach (var item in clientCommon.GetItemQueryIterator<ExamItem>(queryText: sql_examName))
- {
- examItemName.Add(item);
- }
- // 重新比對資料以防 班級人數跟評量分數的數量對不上
- for (int i = 0; i < examItem.Count; i++)
- {
- for (int j = 0; j < members.Count; j++)
- {
- var find = from data in examItem[i].studentIds
- where data.ToString() == members[j].id
- select data;
- if (find.Count() == 0)
- {// 如果學生ID不存在就補0
- examItem[i].studentIds.Insert(j, members[j].id);
- examItem[i].sum.Insert(j, 0);
- }
- }
- }
- //如果評量ID的數量跟撈出來的名稱數量不一致
- // 合併成完整資料
- for (int i = 0; i < examItem.Count; i++)
- {
- ScoreCalcActivityItems scoreCalcActivityItems = new ScoreCalcActivityItems();
- scoreCalcActivityItems.id = examItem[i].examId;
- scoreCalcActivityItems.name = examItemName[i].name;
- scoreCalcActivityItems.use = true;
- scoreCalcActivity_eaxm.items.Add(scoreCalcActivityItems);
- scoreCalcActivity_eaxm.stuActScores.Add(examItem[i].sum);
- scoreCalcActivity_eaxm.stuActScoresOrg.Add(examItem[i].sum);
- }
- #endregion
- #region ==== 4. 取系統作業活動成績====
- //1. 取得此班級全部作業活動的id
- string sql_homeworkIds = "";
- // 由classId判斷是取甚麼班級
- if (ishaveClassId)
- {
- sql_homeworkIds = $"SELECT c.id, c.name FROM c WHERE c.pk = 'Homework' AND ARRAY_CONTAINS(c.classes, \"{classId}\", true)";
- }
- else
- {
- sql_homeworkIds = $"SELECT c.id, c.name FROM c WHERE c.pk = \"Homework\" AND ARRAY_CONTAINS(c.stuLists, \"{grouplistId}\", true)";
- }
- await foreach (var item in clientCommon.GetItemQueryIterator<HomeworkItem>(queryText: sql_homeworkIds))
- {
- homeworkItems.Add(item);
- }
- //2. 用此班級全部作業活動的id去查詢此班級全部作業活動的分數
- StringBuilder sb_homeworkItemIds = new StringBuilder();
- sb_homeworkItemIds.Append("'',");
- for (int i = 0; i < homeworkItems.Count; i++)
- {
- List<double> scores = new List<double>();
- for (int j = 0; j < members.Count; j++)
- {
- scores.Add(0);
- }
- ScoreCalcActivityItems scoreCalcActivityItems = new ScoreCalcActivityItems();
- scoreCalcActivityItems.id = homeworkItems[i].id;
- scoreCalcActivityItems.name = homeworkItems[i].name;
- scoreCalcActivityItems.use = true;
- scoreCalcActivity_homework.items.Add(scoreCalcActivityItems);
- scoreCalcActivity_homework.stuActScores.Add(scores);
- scoreCalcActivity_homework.stuActScoresOrg.Add(scores);
- // 組合id
- sb_homeworkItemIds.Append($"'{homeworkItems[i].id}',");
- }
- // 取分數
- string sql_homeworkData = $"SELECT c.pk, c.school, c.code, c.id, c.score FROM c WHERE c.pk = 'HomeworkRecord' and c.id in ({sb_homeworkItemIds.ToString().Remove(sb_homeworkItemIds.Length - 1, 1)}) order by c.code ";
- await foreach (var item in clientStudent.GetItemQueryIterator<HomeworkItem>(queryText: sql_homeworkData))
- {
- homeworkItemsScore.Add(item);
- }
- // 先以子項目id群組化分數
- Dictionary<string, List<HomeworkItem>> hidDataList = homeworkItemsScore.GroupBy(o => o.id).ToDictionary(o => o.Key, o => o.ToList());
- // 整理出完整的學生作業分數資料
- for (int i = 0; i < scoreCalcActivity_homework.items.Count; i++)
- {
- if (hidDataList.ContainsKey(scoreCalcActivity_homework.items[i].id))
- {
- List<HomeworkItem> listhi = hidDataList[scoreCalcActivity_homework.items[i].id];
- for (int j = 0; j < listhi.Count; j++)
- {
- for (int k = 0; k < members.Count; k++)
- {
- if (listhi[j].code == $"{listhi[j].pk}-{listhi[j].school}-{members[k].id}")
- {
- scoreCalcActivity_homework.stuActScores[i][k] = listhi[j].score;
- scoreCalcActivity_homework.stuActScoresOrg[i][k] = listhi[j].score;
- }
- }
- }
- }
- }
- #endregion
- #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();
- }
- }
- }
- }
|