1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758 |
- using Azure;
- using Azure.Core;
- using Azure.Cosmos;
- using Azure.Messaging.ServiceBus;
- using Azure.Storage.Blobs.Models;
- using DinkToPdf.Contracts;
- using HTEXLib.COMM.Helpers;
- using Microsoft.AspNetCore.Authorization;
- using Microsoft.AspNetCore.Hosting;
- using Microsoft.AspNetCore.Mvc;
- using Microsoft.Extensions.Configuration;
- using Microsoft.Extensions.Options;
- using Newtonsoft.Json;
- using StackExchange.Redis;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Text;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.Models;
- using TEAMModelOS.SDK;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Extension;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.Models.Cosmos.School;
- using TEAMModelOS.SDK.Models.Service;
- 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);
- ishaveClassId = !string.IsNullOrWhiteSpace(classId + "");
- ishaveGrouplistId = !string.IsNullOrWhiteSpace(grouplistId + "");
- string sql = "";
- // classId 跟 grouplistId 兩個必須有一個必填
- if (!ishaveClassId)
- {
- if (!ishaveGrouplistId)
- {
- return BadRequest();
- }
- else
- {
- sql = $"SELECT c.id, c.name, c.sort, c.createTime FROM c where c.courseId = '{courseId}' and c.grouplistId = '{grouplistId}' order by c.sort Desc ";
- }
- }
- else
- {
- sql = $"SELECT c.id, c.name, c.sort, c.createTime 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();
- request.TryGetProperty("classId", out JsonElement classId);
- request.TryGetProperty("grouplistId", out JsonElement grouplistId);
- bool ishaveClassId = !string.IsNullOrWhiteSpace(classId + "");
- bool ishaveGrouplistId = !string.IsNullOrWhiteSpace(grouplistId + "");
- request.TryGetProperty("scope", out JsonElement scope);
- bool ishaveScope = !string.IsNullOrWhiteSpace(scope + "");
- if (!ishaveScope) { return BadRequest(); }
- var clientStudent = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student);
- var clientSchool = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School);
- 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<ScoreCalcMember> memberirs = new List<ScoreCalcMember>();
- List<Object> scoreCalcAct = new List<Object>();
- List<ScoreCalcFunc> scoreCalcFunc = new List<ScoreCalcFunc>();
- StringBuilder sb = new StringBuilder();
- await foreach (var item in client.GetItemQueryIterator<ScoreCalcMember>(queryText: sql))
- {
- members.Add(item);
- sb.Append($"'{item.id}',");
- }
- #region 取學生irs號碼
- string sql_members = "";
- if (ishaveClassId)
- {// 如果有classId 直接到student 取資料
- sql_members = $"SELECT c.id, c.irs FROM c WHERE c.id in ({sb.ToString().Remove(sb.Length - 1, 1)})";
- await foreach (var item in clientStudent.GetItemQueryIterator<ScoreCalcMember>(queryText: sql_members))
- {
- memberirs.Add(item);
- }
- }
- else if (scope.ToString() == "school")
- {// 選課班 撈School 取id irs
- if (ishaveGrouplistId)
- {
- sql_members = $"SELECT b.id, b.irs FROM c join b in c.members WHERE c.id= '{grouplistId}'";
- await foreach (var item in clientSchool.GetItemQueryIterator<ScoreCalcMember>(queryText: sql_members))
- {
- memberirs.Add(item);
- }
- }
- else { return BadRequest(); }
- }
- else if (scope.ToString() == "private")
- {// 私人班 撈Teacher 取id irs
- if (ishaveGrouplistId)
- {
- sql_members = $"SELECT b.id, b.irs FROM c join b in c.members WHERE c.id = '{grouplistId}'";
- await foreach (var item in client.GetItemQueryIterator<ScoreCalcMember>(queryText: sql_members))
- {
- memberirs.Add(item);
- }
- }
- else { return BadRequest(); }
- }
- else { return BadRequest(); }
- for (int i = 0; i < members.Count; i++)
- {
- for (int j = 0; j < memberirs.Count; j++)
- {
- if (members[i].id == memberirs[j].id)
- {
- members[i].irs = memberirs[j].irs;
- }
- }
- }
- #endregion
- #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, c.sort, c.custom 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, c.sort, c.custom 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")}' and c.scorecalcActId = '{scoreCalcLsRecord[0].id}'";
- 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;
- scoreCalcLsRecordActDto.sort = scoreCalcLsRecord[0].sort;
- #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].stuActAttendScores.Count; i++)
- {
- if (scoreCalcLsRecord[0].items[i].use)
- {// 如果是有勾選的才列入統計
- for (int j = 0; j < scoreCalcLsRecord[0].stuActAttendScores[i].Count; j++)
- {
- switch (scoreCalcLsRecord[0].stuActAttendScores[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.startTime = scoreCalcLsRecord[0].items[i].createTime;
- // 子項目比重由外層取得
- subActLsRecord.rate = scoreCalcLsRecord[0].itemRates[i];
- subActLsRecord.use = scoreCalcLsRecord[0].items[i].use;
- subActLsRecord.sort = scoreCalcLsRecord[0].items[i].sort;
- subActLsRecord.custom = scoreCalcLsRecord[0].items[i].custom;
- // 子項目 出席 / 記分板 / 互動 成績由外層取得
- 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;
- scoreCalcActivityActDto.sort = scoreCalcActivity[i].sort;
- 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.startTime = scoreCalcActivity[i].items[j].createTime;
- // 子項目比重由外層取得
- subActActivity.rate = scoreCalcActivity[i].itemRates[j];
- subActActivity.use = scoreCalcActivity[i].items[j].use;
- subActActivity.sort = scoreCalcActivity[i].items[j].sort;
- subActActivity.custom = scoreCalcActivity[i].items[j].custom;
- subActActivity.scores = scoreCalcActivity[i].stuActScores[j];
- scoreCalcActivityActDto.items.Add(subActActivity);
- }
- scoreCalcActivityActDto.editScores = scoreCalcActivity[i].editScores;
- scoreCalcAct.Add(scoreCalcActivityActDto);
- }
- #endregion
- #region ====取得學生資料===
- string sql_editScores = $"select c.editScores from c where c.id = '{id}'";
- List<EditScores> editScores = new List<EditScores>();
- await foreach (var item in client.GetItemQueryIterator<EditScores>(queryText: sql_editScores))
- {
- editScores.Add(item);
- }
- if (editScores.Count == 0)
- {
- editScores.Add(new EditScores());
- }
- #endregion
- #region ====取得建立資料===
- string sql_createTime = $"select c.createTime from c where c.id = '{id}'";
- List<ScoreCalcBase> scoreCalcBase = new List<ScoreCalcBase>();
- await foreach (var item in client.GetItemQueryIterator<ScoreCalcBase>(queryText: sql_createTime))
- {
- scoreCalcBase.Add(item);
- }
- long? createTime = 0;
- if (scoreCalcBase.Count > 0)
- {
- createTime = scoreCalcBase[0].createTime;
- }
- #endregion
- var result = new
- {
- members = members,
- scoreCalcAct = scoreCalcAct,
- scoreCalcFunc = scoreCalcFunc,
- editScores = editScores[0].editScores,
- createTime = createTime
- };
- 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);
- ishaveClassId = !string.IsNullOrWhiteSpace(classId + "");
- ishaveGrouplistId = !string.IsNullOrWhiteSpace(grouplistId + "");
- bool ishaveTeammodelId = request.TryGetProperty("teammodelId", out JsonElement teammodelId);
- bool ishaveSchoolId = request.TryGetProperty("schoolId", out JsonElement schoolId);
- if ((schoolId + "") == "SYSTEM_NO_SCHOOL" || string.IsNullOrWhiteSpace(schoolId + ""))
- {
- ishaveSchoolId = false;
- }
- bool ishaveSubjectId = request.TryGetProperty("subjectId", out JsonElement subjectId);
- ishaveSubjectId = !string.IsNullOrWhiteSpace(subjectId + "");
- bool ishaveName = request.TryGetProperty("name", out JsonElement name);
- ishaveName = !string.IsNullOrWhiteSpace(name + "");
- request.TryGetProperty("year", out JsonElement _year);
- bool ishaveYear = !string.IsNullOrWhiteSpace(_year + "");
- string year = "0";
- request.TryGetProperty("copyid", out JsonElement copyid);
- bool ishaveCopyid = !string.IsNullOrWhiteSpace(copyid + "");
- // classId 跟 grouplistId 兩個必須有一個必填
- if (!ishaveClassId)
- {
- if (!ishaveGrouplistId)
- {
- return BadRequest();
- }
- else
- {
- if (!ishaveTeammodelId) return BadRequest();
- }
- }
- else
- {
- if (!ishaveSchoolId) return BadRequest();
- }
- if (ishaveSchoolId)
- {
- if (!ishaveYear) { return BadRequest(); }
- else { year = _year + ""; }
- }
- // 設定活動預設值
- ScoreCalcLsRecord scoreCalcLsRecord = new ScoreCalcLsRecord();
- ScoreCalcActivity scoreCalcActivity_eaxm = new ScoreCalcActivity();
- ScoreCalcActivity scoreCalcActivity_homework = new ScoreCalcActivity();
- ScoreCalcLsRecord scoreCalcLsRecord_copy = new ScoreCalcLsRecord();
- List<ScoreCalcActivity> scoreCalcActivity_copyList = new List<ScoreCalcActivity>();
- string lessonRecordid_copy = "";
- 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, subjectId, ishaveClassId, ishaveGrouplistId, ishaveSubjectId, 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 = ishaveName ? (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;
- scoreCalcBase.year = Convert.ToInt32(year);
- scoreCalcBase.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- //取得目前成績統計總數
- 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.items[j].custom = false;
- }
- scoreCalcLsRecord.editScores = editScores;
- scoreCalcLsRecord.code = scoreCalcLsRecord.pk + "-" + teammodelId;
- scoreCalcLsRecord.sort = 1;
- //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.items[j].custom = false;
- }
- scoreCalcActivity_eaxm.editScores = editScores;
- scoreCalcActivity_eaxm.code = scoreCalcActivity_eaxm.pk + "-" + teammodelId;
- //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.items[j].custom = false;
- }
- scoreCalcActivity_homework.editScores = editScores;
- scoreCalcActivity_homework.code = scoreCalcActivity_homework.pk + "-" + teammodelId;
- //scoreCalcAct.Add(scoreCalcActivity_homework);
- #endregion
- bool isCopyMode = true;
- /* 複製的邏輯
- 1. 大項目的百分比
- 2. 自訂項目
- 3. 自定子項目(不包含分數、比重)
- */
- if (ishaveCopyid)
- {
- // 如果有複製id,需要取指定id的成績統計來複製一些設定
- string sql_copy = $"SELECT * FROM c where c.scorecalcId = '{copyid}'";
- List<ScoreCalcActivityBase> scoreCalcActivityBaseList_copy = new List<ScoreCalcActivityBase>();
- await foreach (var item in clientTeacher.GetItemQueryIterator<ScoreCalcActivityBase>(queryText: sql_copy))
- {
- scoreCalcActivityBaseList_copy.Add(item);
- }
- if (scoreCalcActivityBaseList_copy.Count > 0)
- {
- // 如果有複製id 要複製目標的百分比
- // 根據學生數量設定預設值
- List<double> zeroScores = new List<double>();
- for (int j = 0; j < scoreCalcBase.members.Count; j++)
- {
- zeroScores.Add(0);
- }
- for (int k = 0; k < scoreCalcActivityBaseList_copy.Count; k++)
- {
- switch (scoreCalcActivityBaseList_copy[k].type)
- {
- case "lessonrecord":
- #region ===設定課堂記錄===
- lessonRecordid_copy = scoreCalcActivityBaseList_copy[k].id;
- scoreCalcLsRecord_copy = await clientTeacher.ReadItemAsync<ScoreCalcLsRecord>(lessonRecordid_copy, new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- scoreCalcLsRecord.rate = scoreCalcLsRecord_copy.rate;
- scoreCalcLsRecord.attendRate = scoreCalcLsRecord_copy.attendRate;
- scoreCalcLsRecord.pointRate = scoreCalcLsRecord_copy.pointRate;
- scoreCalcLsRecord.itactRate = scoreCalcLsRecord_copy.itactRate;
- for (int i = 0; i < scoreCalcLsRecord_copy.items.Count; i++)
- {
- if (scoreCalcLsRecord_copy.items[i].custom == true)
- {// 如果複製的目標有自訂子項目 要多設定子項目的預設資料
- scoreCalcLsRecord_copy.items[i].sort = scoreCalcLsRecord.items.Count + 1;
- scoreCalcLsRecord_copy.items[i].id = Guid.NewGuid().ToString();
- scoreCalcLsRecord_copy.items[i].use = false;
- scoreCalcLsRecord_copy.items[i].createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- scoreCalcLsRecord.items.Add(scoreCalcLsRecord_copy.items[i]);
- 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.CreateItemAsync(scoreCalcLsRecord, new PartitionKey($"{scoreCalcLsRecord.code}"));
- #endregion
- break;
- case "homework":
- // ===設定作業活動===
- await setCopyAct(scoreCalcActivityBaseList_copy[k].id, teammodelId, scoreCalcActivity_homework, zeroScores);
- scoreCalcActivity_homework = await clientTeacher.CreateItemAsync(scoreCalcActivity_homework, new PartitionKey($"{scoreCalcActivity_homework.code}"));
- break;
- case "exam":
- // ===設定評量活動===
- await setCopyAct(scoreCalcActivityBaseList_copy[k].id, teammodelId, scoreCalcActivity_eaxm, zeroScores);
- scoreCalcActivity_eaxm = await clientTeacher.CreateItemAsync(scoreCalcActivity_eaxm, new PartitionKey($"{scoreCalcActivity_eaxm.code}"));
- break;
- case "custom":
- // ===自訂項目===
- ScoreCalcActivity scoreCalcActivity = new ScoreCalcActivity();
- scoreCalcActivity.id = Guid.NewGuid().ToString();
- scoreCalcActivity.scorecalcId = scoreCalcBase.id;
- scoreCalcActivity.name = scoreCalcActivityBaseList_copy[k].name;
- scoreCalcActivity.type = scoreCalcActivityBaseList_copy[k].type;
- scoreCalcActivity.rate = scoreCalcActivityBaseList_copy[k].rate;
- scoreCalcActivity.sort = scoreCalcActivityBaseList_copy[k].sort;
- scoreCalcActivity.editScores = editScores;
- scoreCalcActivity.code = scoreCalcActivityBaseList_copy[k].pk + "-" + teammodelId;
- await setCopyAct(scoreCalcActivityBaseList_copy[k].id, teammodelId, scoreCalcActivity, zeroScores);
- // 新增項目及子項目
- scoreCalcActivity = await clientTeacher.CreateItemAsync(scoreCalcActivity, new PartitionKey($"{scoreCalcActivity.pk + "-" + teammodelId}"));
- break;
- }
- }
- }
- else
- {// 沒有複製id的資料 走原本的新增動作
- isCopyMode = false;
- }
- }
- else
- {// 沒有複製id 走原本的新增動作
- isCopyMode = false;
- }
- if (!isCopyMode) // 不是複製模式 走原本的新增動作
- {
- scoreCalcLsRecord = await clientTeacher.CreateItemAsync(scoreCalcLsRecord, new PartitionKey($"{scoreCalcLsRecord.code}"));
- scoreCalcActivity_eaxm = await clientTeacher.CreateItemAsync(scoreCalcActivity_eaxm, new PartitionKey($"{scoreCalcActivity_eaxm.code}"));
- scoreCalcActivity_homework = await clientTeacher.CreateItemAsync(scoreCalcActivity_homework, new PartitionKey($"{scoreCalcActivity_homework.code}"));
- }
- #endregion
- #region ==== 5.3 用ScoreCalcAct的id 寫入課堂紀錄公式表ScoreCalcActFormula====
- if (ishaveCopyid)
- {// 如果有複製id 要用複製的成績統計的公式資料寫入DB
- string sql_FormulaCopy = $"SELECT * FROM c where c.scorecalcActId = '{lessonRecordid_copy}'";
- List<ScoreCalcFunc> scoreCalcFuncList_copy = new List<ScoreCalcFunc>();
- await foreach (var item in clientTeacher.GetItemQueryIterator<ScoreCalcFunc>(queryText: sql_FormulaCopy))
- {
- scoreCalcFuncList_copy.Add(item);
- }
- for (int i = 0; i < scoreCalcFuncList_copy.Count; i++)
- {
- switch (scoreCalcFuncList_copy[i].method)
- {
- case "attend":
- if (scoreCalcFuncList_copy[i].id == scoreCalcLsRecord_copy.stuAttendFunctionId)
- {// 如果此筆資料是複製目標之前指定的公式 就要指定成這次的使用公式
- scoreCalcFuncList_copy[i].id = scoreCalcLsRecord.stuAttendFunctionId;
- }
- else { scoreCalcFuncList_copy[i].id = Guid.NewGuid().ToString(); }
- break;
- case "point":
- if (scoreCalcFuncList_copy[i].id == scoreCalcLsRecord_copy.stuPointFunctionId)
- {// 如果此筆資料是複製目標之前指定的公式 就要指定成這次的使用公式
- scoreCalcFuncList_copy[i].id = scoreCalcLsRecord.stuPointFunctionId;
- }
- else { scoreCalcFuncList_copy[i].id = Guid.NewGuid().ToString(); }
- break;
- case "interaction":
- if (scoreCalcFuncList_copy[i].id == scoreCalcLsRecord_copy.stuItactFunctionId)
- {// 如果此筆資料是複製目標之前指定的公式 就要指定成這次的使用公式
- scoreCalcFuncList_copy[i].id = scoreCalcLsRecord.stuItactFunctionId;
- }
- else { scoreCalcFuncList_copy[i].id = Guid.NewGuid().ToString(); }
- break;
- }
- scoreCalcFuncList_copy[i].scorecalcActId = scoreCalcLsRecord.id;
- scoreCalcFuncList_copy[i] = await clientTeacher.CreateItemAsync(scoreCalcFuncList_copy[i], new PartitionKey($"{scoreCalcFuncList_copy[i].code}"));
- }
- }
- else
- {// 一般新增流程 新增公式
- #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();
- }
- }
- private async Task<ScoreCalcActivity> setCopyAct(string id, JsonElement teammodelId, ScoreCalcActivity scoreCalcActivity, List<double> zeroScores)
- {
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- ScoreCalcActivity scoreCalcActivity_copy = await clientTeacher.ReadItemAsync<ScoreCalcActivity>(id, new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- scoreCalcActivity.rate = scoreCalcActivity_copy.rate;
- for (int i = 0; i < scoreCalcActivity_copy.items.Count; i++)
- {
- if (scoreCalcActivity_copy.items[i].custom == true)
- {// 如果複製的目標有自訂子項目 要多設定子項目的預設資料
- scoreCalcActivity_copy.items[i].sort = scoreCalcActivity.items.Count + 1;
- scoreCalcActivity_copy.items[i].id = Guid.NewGuid().ToString();
- scoreCalcActivity_copy.items[i].use = false;
- scoreCalcActivity_copy.items[i].createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- scoreCalcActivity.items.Add(scoreCalcActivity_copy.items[i]);
- scoreCalcActivity.stuActScores.Add(zeroScores);
- scoreCalcActivity.stuActScoresOrg.Add(zeroScores);
- scoreCalcActivity.itemRates.Add(1);
- }
- }
- return scoreCalcActivity;
- }
- /// <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());
- // 取主表資料
- ScoreCalcBase scoreCalcBase = await clientTeacher.ReadItemAsync<ScoreCalcBase>(id.ToString(), new PartitionKey($"ScoreCalc-{teammodelId}"));
- if (string.IsNullOrWhiteSpace(scoreCalcBase.courseId)) { return BadRequest(); }
- // classId 跟 grouplistId 兩個必須有一個
- string sql_CalcList = "";
- if (string.IsNullOrWhiteSpace(scoreCalcBase.classId))
- {
- if (string.IsNullOrWhiteSpace(scoreCalcBase.grouplistId))
- {
- return BadRequest();
- }
- else
- {
- sql_CalcList = $"SELECT * FROM c where c.courseId = '{scoreCalcBase.courseId}' and c.grouplistId = '{scoreCalcBase.grouplistId}' order by c.sort ";
- }
- }
- else
- {
- sql_CalcList = $"SELECT * FROM c where c.courseId = '{scoreCalcBase.courseId}' and c.classId = '{scoreCalcBase.classId}' order by c.sort ";
- }
- #region 刪除流程
- // 取項目表的 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 scorecalcActIdstr = "''";
- if (sb.Length > 0)
- {
- scorecalcActIdstr = sb.ToString().Remove(sb.Length - 1, 1);
- }
- string sql_Formula = $"SELECT c.id FROM c where c.scorecalcActId in ({scorecalcActIdstr}) ";
- 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}");
- #endregion
- #region 刪除後同時需要重新排序其他的成績統計 從1開始
- // 取主表的資料
- List<ScoreCalcBase> scoreCalcBases = new List<ScoreCalcBase>();
- await foreach (var item in clientTeacher.GetItemQueryIterator<ScoreCalcBase>(queryText: sql_CalcList))
- {
- scoreCalcBases.Add(item);
- }
- for (int i = 0; i < scoreCalcBases.Count; i++)
- {
- scoreCalcBases[i].sort = i + 1;
- //更新順序
- scoreCalcBases[i] = await clientTeacher.ReplaceItemAsync(scoreCalcBases[i], $"{scoreCalcBases[i].id}", new PartitionKey(scoreCalcBases[i].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("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 更新 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();
- updateFormulaRq.scoreCalcFunc[i].id = scoreCalcFunc.id;// 同時設定要新增的公式Id給Act
- 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
- #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
- }
- 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();
- bool ishaveName = request.TryGetProperty("name", out JsonElement name);
- ishaveName = !string.IsNullOrWhiteSpace(name + "");
- bool ishavesubName = request.TryGetProperty("subName", out JsonElement subName);
- ishavesubName = !string.IsNullOrWhiteSpace(subName + "");
- 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 = ishavesubName ? (subName + "") : "子項目";
- scoreCalcActivityItems.use = true;
- scoreCalcActivityItems.sort = 1;
- scoreCalcActivityItems.custom = true;
- scoreCalcActivityItems.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- 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 = ishaveName ? (name + "") : "新項目";
- scoreCalcActivity.type = "custom";
- scoreCalcActivity.rate = 0;
- 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];
- subActActivity.sort = scoreCalcActivity.items[0].sort;
- subActActivity.custom = scoreCalcActivity.items[0].custom;
- subActActivity.startTime = scoreCalcActivity.items[0].createTime;
- 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();
- bool ishaveName = request.TryGetProperty("name", out JsonElement name);
- ishaveName = !string.IsNullOrWhiteSpace(name + "");
- 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 = ishaveName ? (name + "") : "子項目";
- scoreCalcActivityItems.use = true;
- scoreCalcActivityItems.custom = true;
- scoreCalcActivityItems.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- // 先判斷是否為課堂紀錄 根據項目的類別寫入的欄位需要調整
- if (scoreCalcActivityBase.type == "lessonrecord")
- {
- ScoreCalcLsRecord scoreCalcLsRecord = await clientTeacher.ReadItemAsync<ScoreCalcLsRecord>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- scoreCalcActivityItems.sort = scoreCalcLsRecord.items.Count + 1;
- 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.startTime = scoreCalcLsRecord.items[scoreCalcLsRecord.items.Count - 1].createTime;
- subActLsRecord.stuActAttendScores = scoreCalcLsRecord.stuActAttendScores[scoreCalcLsRecord.stuActAttendScores.Count - 1];
- subActLsRecord.stuActPointScores = scoreCalcLsRecord.stuActPointScores[scoreCalcLsRecord.stuActPointScores.Count - 1];
- subActLsRecord.stuActItactScores = scoreCalcLsRecord.stuActItactScores[scoreCalcLsRecord.stuActItactScores.Count - 1];
- subActLsRecord.sort = scoreCalcActivityItems.sort;
- subActLsRecord.custom = scoreCalcActivityItems.custom;
- #endregion
- return Ok(subActLsRecord);
- }
- else
- {
- ScoreCalcActivity scoreCalcActivity = await clientTeacher.ReadItemAsync<ScoreCalcActivity>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- scoreCalcActivityItems.sort = scoreCalcActivity.items.Count + 1;
- 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.startTime = scoreCalcActivity.items[scoreCalcActivity.items.Count - 1].createTime;
- subActActivity.scores = scoreCalcActivity.stuActScores[scoreCalcActivity.stuActScores.Count - 1];
- subActActivity.sort = scoreCalcActivityItems.sort;
- subActActivity.custom = scoreCalcActivityItems.custom;
- #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);
- // 取項目表資料
- ScoreCalcActivityBase scoreCalcActivityBase = await clientTeacher.ReadItemAsync<ScoreCalcActivityBase>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- UpdateActivityActRq updateActivityActRq = JsonConvert.DeserializeObject<UpdateActivityActRq>(request.ToString());
- var result = new
- {
- RtCode = "0",
- RtMsg = "OK"
- };
- // 先判斷是否為課堂紀錄 根據項目的類別要撈不同欄位的資料出來更新
- if (scoreCalcActivityBase.type == "lessonrecord")
- {
- ScoreCalcLsRecord scoreCalcLsRecord = await clientTeacher.ReadItemAsync<ScoreCalcLsRecord>(scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- //設定需更新的欄位值
- scoreCalcLsRecord.name = updateActivityActRq.name;
- scoreCalcLsRecord.rate = updateActivityActRq.rate;
- for (int i = 0; i < scoreCalcLsRecord.items.Count; i++)
- {
- for (int j = 0; j < updateActivityActRq.items.Count; j++)
- {
- if (scoreCalcLsRecord.items[i].id == updateActivityActRq.items[j].id)
- {
- scoreCalcLsRecord.items[i].name = updateActivityActRq.items[j].name;
- scoreCalcLsRecord.items[i].use = updateActivityActRq.items[j].use;
- scoreCalcLsRecord.itemRates[i] = updateActivityActRq.items[j].rate;
- scoreCalcLsRecord.items[i].sort = updateActivityActRq.items[j].sort;
- }
- }
- }
- //更新
- 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}"));
- //設定需更新的欄位值
- 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.items[i].sort = updateActivityActRq.items[j].sort;
- }
- }
- }
- //更新
- 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("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();
- if (!request.TryGetProperty("scorecalcId", out JsonElement scorecalcId)) 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}"));
- #region 同時需要重新排序其他的項目 從1開始
- List<ScoreCalcActivity> scoreCalcActivitys = new List<ScoreCalcActivity>();
- // 取項目表的資料
- string sql = $"SELECT * FROM c where c.type = 'custom' and c.scorecalcId = '{scorecalcId}' order by c.sort ";
- await foreach (var item in clientTeacher.GetItemQueryIterator<ScoreCalcActivity>(queryText: sql))
- {
- scoreCalcActivitys.Add(item);
- }
- for (int i = 0; i < scoreCalcActivitys.Count; i++)
- {
- // 因為前面有三個系統項目為固定項目不能移動或是刪除所以從 4 開始排序
- scoreCalcActivitys[i].sort = i + 4;
- scoreCalcActivitys[i] = await clientTeacher.ReplaceItemAsync(scoreCalcActivitys[i], $"{scoreCalcActivitys[i].id}", new PartitionKey(scoreCalcActivitys[i].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-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]);
- }
- }
- #region 同時需要重新排序其他的項目 從1開始
- for (int i = 0; i < scoreCalcLsRecord.items.Count; i++)
- {
- scoreCalcLsRecord.items[i].sort = i + 1;
- }
- #endregion
- 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]);
- }
- }
- #region 同時需要重新排序其他的項目 從1開始
- scoreCalcActivity.items = scoreCalcActivity.items.OrderBy(item => item.sort).ToList();
- for (int i = 0; i < scoreCalcActivity.items.Count; i++)
- {
- scoreCalcActivity.items[i].sort = i + 1;
- }
- #endregion
- 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);
- ishaveClassId = !string.IsNullOrWhiteSpace(classId + "");
- ishaveGrouplistId = !string.IsNullOrWhiteSpace(grouplistId + "");
- bool ishaveTeammodelId = request.TryGetProperty("teammodelId", out JsonElement teammodelId);
- bool ishaveSchoolId = request.TryGetProperty("schoolId", out JsonElement schoolId);
- bool ishaveSubjectId = request.TryGetProperty("subjectId", out JsonElement subjectId);
- ishaveSubjectId = !string.IsNullOrWhiteSpace(subjectId + "");
- // 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, subjectId, ishaveClassId, ishaveGrouplistId, ishaveSubjectId, 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, JsonElement subjectId, bool ishaveClassId, bool ishaveGrouplistId, bool ishaveSubjectId, 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> examItemNameStartTime = 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}' and c.code = 'Base-{schoolId}'";
- 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}' and c.code = 'GroupList-{schoolId}'";
- 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)}) and c.code = 'Base-{schoolId}'";
- 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}' and c.code = 'GroupList'";
- 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
- {
- 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}"))// 如果有學校ID
- {
- code = $"LessonRecord-{schoolId}";// 組合區域碼
- tbname = "School";
- school = $"{schoolId}";
- //只查询某个老师的课例
- if (string.IsNullOrWhiteSpace($"{teammodelId}"))
- {
- return false;
- }
- }
- else
- {
- return false;
- }
- }
- else if ($"{scope}".Equals("private"))
- {
- code = $"LessonRecord";
- tbname = "Teacher";
- if (string.IsNullOrEmpty($"{teammodelId}"))
- {
- //如果不传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 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<ScoreLessonBase> lessonBases = new List<ScoreLessonBase>();
- string blobname = "";
- foreach (var item in lessonRecords)
- {// 先檢查課堂紀錄是否存在再取資料
- if (item.scope.Equals("school"))
- {// 學校課程 用學校id取blob
- blobname = schoolId.GetString();
- 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();
- ScoreLessonBase lessonBase = baseblobDownload.Content.ToObjectFromJson<ScoreLessonBase>();
- if (lessonBase != null && lessonBase.summary != null)
- {
- lessonBases.Add(lessonBase);
- }
- }
- }
- else
- { // 個人課程
- List<CourseTask_ta> ctList = new();
- // 檢查這個課程的助教跟教授裡面有沒有包含傳進來的teammodelId 有的話用教授取blob的資料
- string sqlCourseTask = $"SELECT distinct b.teacherId, b.assistants FROM c join b in c.schedules where c.pk = 'CourseTask' and (ARRAY_CONTAINS(b.assistants, '{teammodelId}') or b.teacherId = '{teammodelId}') and b.groupId = '{grouplistId}' and c.code = 'CourseTask' and c.courseId = '{courseId}' AND ARRAY_LENGTH(b.assistants) > 0";
- //string sqlCourseTask = $"SELECT s.groupId, s.assistants FROM c JOIN s IN c.schedules WHERE c.pk='CourseTask'AND c.courseId = '{courseId}' AND s.groupId = '{grouplistId}' AND ARRAY_LENGTH(s.assistants) > 0";
- await foreach (var ctitem in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<CourseTask_ta>(queryText: sqlCourseTask))
- {
- ctList.Add(ctitem);
- }
- if (ctList.Count > 0)
- {
- blobname = ctList[0].teacherId;
- 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();
- ScoreLessonBase lessonBase = baseblobDownload.Content.ToObjectFromJson<ScoreLessonBase>();
- if (lessonBase != null && lessonBase.summary != null)
- {
- lessonBases.Add(lessonBase);
- }
- }
- }
- else { return false; }
-
- }
-
- }
- List<ScoreLessonBase> lessonBasesCalcList = new List<ScoreLessonBase>();
- // 重新比對資料以防 班級人數跟分數的數量對不上
- for (int i = 0; i < lessonBases.Count; i++)
- {
- //因為有可能取出的JSON 學生人數對不準,所以需要另外建一個LessonBase接正確的資料
- ScoreLessonBase lessonBaseCalc = new ScoreLessonBase();
- lessonBaseCalc.summary = lessonBases[i].summary;
- lessonBaseCalc.report = new ScoreReport();
- lessonBaseCalc.report.clientSummaryList = new List<ScoreClientSummaryList>();
- // 設定分數的預設值
- for (int f = 0; f < members.Count; f++)
- {
- ScoreClientSummaryList clientSummaryList = new ScoreClientSummaryList();
- clientSummaryList.attendState = 0;
- clientSummaryList.score = 0;
- clientSummaryList.interactScore = 0;
- lessonBaseCalc.report.clientSummaryList.Add(clientSummaryList);
- }
- for (int j = 0; j < lessonBases[i].student.Count; j++)
- {
- for (int k = 0; k < members.Count; k++)
- {
- //如果有比對中學生id再把分數設定過來
- if (lessonBases[i].student[j].id == members[k].id)
- {
- lessonBaseCalc.report.clientSummaryList[k] = lessonBases[i].report.clientSummaryList[j];
- }
- }
- }
- lessonBasesCalcList.Add(lessonBaseCalc);
- }
- for (int i = 0; i < lessonBasesCalcList.Count; i++)
- {
- // 補上寫進DB的子項目名稱欄位
- scoreCalcLsRecord.items[i].name = lessonBasesCalcList[i].summary.meterialName;
- for (int j = 0; j < lessonRecords.Count; j++)
- {
- if (scoreCalcLsRecord.items[i].id == lessonRecords[j].id)
- {
- scoreCalcLsRecord.items[i].createTime = lessonRecords[j].startTime;
- }
- }
- List<double> stuActAttendScores = new List<double>();
- List<double> stuActPointScores = new List<double>();
- List<double> stuActItactScores = new List<double>();
- if (lessonBasesCalcList[i].report.clientSummaryList.Count > 0)
- {
- for (int j = 0; j < lessonBasesCalcList[i].report.clientSummaryList.Count; j++)
- {
- stuActAttendScores.Add(lessonBasesCalcList[i].report.clientSummaryList[j].attendState);
- stuActPointScores.Add(lessonBasesCalcList[i].report.clientSummaryList[j].score);
- stuActItactScores.Add(lessonBasesCalcList[i].report.clientSummaryList[j].interactScore);
- }
- }
- // 分數填入
- 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}'";
- }
- if (ishaveSubjectId)
- {
- sql_exam += $" and c.subjectId = '{subjectId}'";
- }
- 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.id as examId, c.name, c.startTime FROM c where c.pk = 'Exam' and c.id in ({sb_examIds.ToString().Remove(sb_examIds.Length - 1, 1)})";
- //string sql_examName = $"SELECT c.id as examId, 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))
- {
- examItemNameStartTime.Add(item);
- }
- List<ExamItem> examItemCalcList = new List<ExamItem>();
- // 重新比對資料以防 班級人數跟分數的數量對不上
- //需要重新確認
- for (int i = 0; i < examItem.Count; i++)
- {
- //因為有可能取出的資料 學生人數對不準,所以需要另外建一個ExamItem接正確的資料
- ExamItem examItemCalc = new ExamItem();
- examItemCalc.examId = examItem[i].examId;
- examItemCalc.sum = new List<double>();
- // 設定分數的預設值
- for (int f = 0; f < members.Count; f++)
- {
- examItemCalc.sum.Add(0);
- }
- for (int j = 0; j < examItem[i].studentIds.Count; j++)
- {
- for (int k = 0; k < members.Count; k++)
- {
- //如果有比對中學生id再把分數設定過來
- if (examItem[i].studentIds[j] == members[k].id)
- {
- examItemCalc.sum[k] = examItem[i].sum[j];
- }
- }
- }
- examItemCalcList.Add(examItemCalc);
- }
- // 檢查是否有評量資料有缺失的 有缺失的話就先移除該筆評量
- for (int i = 0; i < examItemCalcList.Count; i++)
- {
- bool isDataOk = false;
- for (int j = 0; j < examItemNameStartTime.Count; j++)
- {
- if (examItemCalcList[i].examId == examItemNameStartTime[j].examId)
- {
- isDataOk = true;
- }
- }
- if (!isDataOk)
- {
- examItemCalcList.Remove(examItemCalcList[i]);
- }
- }
- //如果評量ID的數量跟撈出來的名稱數量不一致
- // 合併成完整資料
- for (int i = 0; i < examItemCalcList.Count; i++)
- {
- ScoreCalcActivityItems scoreCalcActivityItems = new ScoreCalcActivityItems();
- scoreCalcActivityItems.id = examItemCalcList[i].examId;
- scoreCalcActivityItems.name = examItemNameStartTime[i].name;
- scoreCalcActivityItems.createTime = examItemNameStartTime[i].startTime;
- scoreCalcActivityItems.use = true;
- scoreCalcActivity_eaxm.items.Add(scoreCalcActivityItems);
- scoreCalcActivity_eaxm.stuActScores.Add(examItemCalcList[i].sum);
- scoreCalcActivity_eaxm.stuActScoresOrg.Add(examItemCalcList[i].sum);
- }
- #endregion
- #region ==== 4. 取系統作業活動成績====
- //1. 取得此班級全部作業活動的id
- string sql_homeworkIds = "";
- // 由classId判斷是取甚麼班級
- if (ishaveClassId)
- {
- sql_homeworkIds = $"SELECT c.id, c.name, c.startTime FROM c WHERE c.pk = 'Homework' AND ARRAY_CONTAINS(c.classes, \"{classId}\", true)";
- }
- else
- {
- sql_homeworkIds = $"SELECT c.id, c.name, c.startTime 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.createTime = homeworkItems[i].startTime;
- 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.sortItems.Count; i++)
- {
- //取主表資料
- ScoreCalcBase scoreCalcBase = await clientTeacher.ReadItemAsync<ScoreCalcBase>(updateCalcSortRq.sortItems[i].id.ToString(), new PartitionKey($"ScoreCalc-{teammodelId}"));
- scoreCalcBase.sort = updateCalcSortRq.sortItems[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();
- }
- }
- /// <summary>
- /// (十五)更新活動項目順序
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [Authorize(Roles = "IES")]
- [HttpPost("update-scorecalcact-sort")]
- public async Task<IActionResult> UpdateScoreCalcActSort(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("teammodelId", out JsonElement teammodelId)) return BadRequest();
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- UpdateActSortRq updateActSortRq = JsonConvert.DeserializeObject<UpdateActSortRq>(request.ToString());
- for (int i = 0; i < updateActSortRq.sortItems.Count; i++)
- {
- // 取項目表資料
- ScoreCalcActivityBase scoreCalcActivityBase = await clientTeacher.ReadItemAsync<ScoreCalcActivityBase>(updateActSortRq.sortItems[i].id.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- // 先判斷是否為課堂紀錄 根據項目的類別需要調整
- if (scoreCalcActivityBase.type == "lessonrecord")
- {
- ScoreCalcLsRecord scoreCalcLsRecord = await clientTeacher.ReadItemAsync<ScoreCalcLsRecord>(updateActSortRq.sortItems[i].id.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- scoreCalcLsRecord.sort = updateActSortRq.sortItems[i].sort;
- scoreCalcLsRecord = await clientTeacher.ReplaceItemAsync(scoreCalcLsRecord, $"{scoreCalcLsRecord.id}", new PartitionKey(scoreCalcLsRecord.code));
- }
- else
- {
- ScoreCalcActivity scoreCalcActivity = await clientTeacher.ReadItemAsync<ScoreCalcActivity>(updateActSortRq.sortItems[i].id.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- scoreCalcActivity.sort = updateActSortRq.sortItems[i].sort;
- 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("update-scorecalcactitem-sort")]
- public async Task<IActionResult> UpdateScoreCalcActItemSort(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("teammodelId", out JsonElement teammodelId)) return BadRequest();
- if (!request.TryGetProperty("scoreCalcActId", out JsonElement scoreCalcActId)) return BadRequest();
- var clientTeacher = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher);
- UpdateActItemSortRq updateActItemSortRq = JsonConvert.DeserializeObject<UpdateActItemSortRq>(request.ToString());
- // 取項目表資料
- ScoreCalcActivityBase scoreCalcActivityBase = await clientTeacher.ReadItemAsync<ScoreCalcActivityBase>(updateActItemSortRq.scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- // 先排序傳進來的參數 aesc
- List<sortItem> sortItemsrq = (from e in updateActItemSortRq.sortItems
- orderby e.sort
- select e).ToList();
- // 先判斷是否為課堂紀錄 根據項目的類別需要調整
- if (scoreCalcActivityBase.type == "lessonrecord")
- {
- ScoreCalcLsRecord scoreCalcLsRecordDB = await clientTeacher.ReadItemAsync<ScoreCalcLsRecord>(updateActItemSortRq.scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- //存放排序後的參數
- List<List<double>> up_stuActAttendOrgVals = new();
- List<List<double>> up_stuActAttendScores = new();
- List<List<double>> up_stuActPointOrgVals = new();
- List<List<double>> up_stuActPointScores = new();
- List<List<double>> up_stuActItactOrgVals = new();
- List<List<double>> up_stuActItactScores = new();
- List<double> up_itemRates = new();
- //依照傳進來的id 順序修改 分數 比重 項目等順序
- for (int i = 0; i < sortItemsrq.Count; i++)
- {
- for (int j = 0; j < scoreCalcLsRecordDB.items.Count; j++)
- {
- if (sortItemsrq[i].id == scoreCalcLsRecordDB.items[j].id)
- {
- up_stuActAttendOrgVals.Add(scoreCalcLsRecordDB.stuActAttendOrgVals[j]);
- up_stuActAttendScores.Add(scoreCalcLsRecordDB.stuActAttendScores[j]);
- up_stuActPointOrgVals.Add(scoreCalcLsRecordDB.stuActPointOrgVals[j]);
- up_stuActPointScores.Add(scoreCalcLsRecordDB.stuActPointScores[j]);
- up_stuActItactOrgVals.Add(scoreCalcLsRecordDB.stuActItactOrgVals[j]);
- up_stuActItactScores.Add(scoreCalcLsRecordDB.stuActItactScores[j]);
- up_itemRates.Add(scoreCalcLsRecordDB.itemRates[j]);
- scoreCalcLsRecordDB.items[j].sort = sortItemsrq[i].sort;
- }
- }
- }
- scoreCalcLsRecordDB.stuActAttendOrgVals = up_stuActAttendOrgVals;
- scoreCalcLsRecordDB.stuActAttendScores = up_stuActAttendScores;
- scoreCalcLsRecordDB.stuActPointOrgVals = up_stuActPointOrgVals;
- scoreCalcLsRecordDB.stuActPointScores = up_stuActPointScores;
- scoreCalcLsRecordDB.stuActItactOrgVals = up_stuActItactOrgVals;
- scoreCalcLsRecordDB.stuActItactScores = up_stuActItactScores;
- scoreCalcLsRecordDB.itemRates = up_itemRates;
- // 按照更新後的sort排序
- scoreCalcLsRecordDB.items = (from e in scoreCalcLsRecordDB.items
- orderby e.sort
- select e).ToList();
- scoreCalcLsRecordDB = await clientTeacher.ReplaceItemAsync(scoreCalcLsRecordDB, $"{scoreCalcLsRecordDB.id}", new PartitionKey(scoreCalcLsRecordDB.code));
- }
- else
- {
- ScoreCalcActivity scoreCalcActivityDB = await clientTeacher.ReadItemAsync<ScoreCalcActivity>(updateActItemSortRq.scoreCalcActId.ToString(), new PartitionKey($"ScoreCalcAct-{teammodelId}"));
- //存放排序後的參數
- List<List<double>> up_stuActScores = new();
- List<List<double>> up_stuActScoresOrg = new();
- List<double> up_itemRates = new();
- //依照傳進來的id 順序修改 分數 比重 項目等順序
- for (int i = 0; i < sortItemsrq.Count; i++)
- {
- for (int j = 0; j < scoreCalcActivityDB.items.Count; j++)
- {
- if (sortItemsrq[i].id == scoreCalcActivityDB.items[j].id)
- {
- up_stuActScores.Add(scoreCalcActivityDB.stuActScores[j]);
- up_stuActScoresOrg.Add(scoreCalcActivityDB.stuActScoresOrg[j]);
- up_itemRates.Add(scoreCalcActivityDB.itemRates[j]);
- scoreCalcActivityDB.items[j].sort = sortItemsrq[i].sort;
- }
- }
- }
- scoreCalcActivityDB.stuActScores = up_stuActScores;
- scoreCalcActivityDB.stuActScoresOrg = up_stuActScoresOrg;
- scoreCalcActivityDB.itemRates = up_itemRates;
- // 按照更新後的sort排序
- scoreCalcActivityDB.items = (from e in scoreCalcActivityDB.items
- orderby e.sort
- select e).ToList();
- scoreCalcActivityDB = await clientTeacher.ReplaceItemAsync(scoreCalcActivityDB, $"{scoreCalcActivityDB.id}", new PartitionKey(scoreCalcActivityDB.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("get-itemprops")]
- public async Task<IActionResult> GetItemProps(JsonElement request)
- {
- try
- {
- if (!request.TryGetProperty("ids", out JsonElement ids)) return BadRequest();
- if (!request.TryGetProperty("type", out JsonElement type)) return BadRequest();
- request.TryGetProperty("scope", out JsonElement scope);
- bool ishaveScope = !string.IsNullOrWhiteSpace(scope + "");
- string[] idsarr = ids.ToString().Split(',');
- StringBuilder idssb = new StringBuilder();
- if (idsarr.Length > 0)
- {
- foreach (var id in idsarr)
- {
- idssb.Append("'");
- idssb.Append(id);
- idssb.Append("'");
- idssb.Append(",");
- }
- if (idssb.Length > 0)
- {
- idssb.Remove(idssb.Length - 1, 1);
- }
- }
- string sql = "";
- List<ItemProps> ItemPropsList = new List<ItemProps>();
- 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);
- switch (type.ToString())
- {
- case "lessonrecord":
- // 如果是課堂紀錄需要多判斷是學校課程還是個人課程 來決定去哪邊撈資料
- if (!ishaveScope) { return BadRequest(); }
- sql = $"SELECT c.id, c.name, c.startTime FROM c where c.id in ({idssb}) and c.pk = 'LessonRecord'";
- if (scope.ToString() == "school")
- {
- await foreach (var item in clientSchool.GetItemQueryIterator<ItemProps>(queryText: sql))
- {
- ItemPropsList.Add(item);
- }
- }
- else
- {
- await foreach (var item in clientTeacher.GetItemQueryIterator<ItemProps>(queryText: sql))
- {
- ItemPropsList.Add(item);
- }
- }
- break;
- case "exam":
- sql = $"SELECT c.id, c.name, c.startTime, c.source as type FROM c where c.id in ({idssb}) and c.pk = 'Exam'";
- await foreach (var item in clientCommon.GetItemQueryIterator<ItemProps>(queryText: sql))
- {
- ItemPropsList.Add(item);
- }
- break;
- case "homework":
- sql = $"SELECT c.id, c.name, c.startTime FROM c where c.id in ({idssb}) and c.pk = 'Homework'";
- await foreach (var item in clientCommon.GetItemQueryIterator<ItemProps>(queryText: sql))
- {
- ItemPropsList.Add(item);
- }
- break;
- }
- return Ok(ItemPropsList);
- }
- 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>
- /// 查詢CourseTask用類別
- /// </summary>
- private class CourseTask_ta
- {
- /// <summary>
- /// teacherId
- /// </summary>
- public string teacherId { get; set; }
- /// <summary>
- /// assistants
- /// </summary>
- public List<string> assistants { get; set; } = new List<string>();
- }
- }
- }
|