CourseBaseController.cs 204 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048
  1. using Microsoft.Azure.Cosmos;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.Extensions.Options;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Text.Json;
  10. using System.Threading.Tasks;
  11. using TEAMModelOS.Models;
  12. using TEAMModelOS.SDK.Models;
  13. using TEAMModelOS.SDK.DI;
  14. using TEAMModelOS.SDK.Extension;
  15. using Azure;
  16. using Microsoft.Extensions.Configuration;
  17. using TEAMModelOS.Filter;
  18. using TEAMModelOS.SDK;
  19. using StackExchange.Redis;
  20. using System.Text.RegularExpressions;
  21. using Microsoft.AspNetCore.Authorization;
  22. using System.Net.Http;
  23. namespace TEAMModelOS.Controllers.Both
  24. {
  25. [ProducesResponseType(StatusCodes.Status200OK)]
  26. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  27. [Route("course-base")]
  28. [ApiController]
  29. public class CourseBaseController : ControllerBase
  30. {
  31. private AzureCosmosFactory _azureCosmos;
  32. private readonly DingDing _dingDing;
  33. private readonly CoreAPIHttpService _coreAPIHttpService;
  34. private readonly Option _option;
  35. private readonly AzureServiceBusFactory _serviceBus;
  36. private readonly AzureStorageFactory _azureStorage;
  37. private readonly AzureRedisFactory _azureRedis;
  38. private static List<string> weekDays = new List<string> { "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN" };
  39. public IConfiguration _configuration { get; set; }
  40. public CourseBaseController(AzureRedisFactory azureRedis, AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, CoreAPIHttpService coreAPIHttpService, AzureServiceBusFactory serviceBus, AzureStorageFactory azureStorage, IConfiguration configuration)
  41. {
  42. _azureCosmos = azureCosmos;
  43. _dingDing = dingDing;
  44. _option = option?.Value;
  45. _serviceBus = serviceBus;
  46. _configuration = configuration;
  47. _azureStorage = azureStorage;
  48. _azureRedis = azureRedis; _coreAPIHttpService = coreAPIHttpService;
  49. }
  50. /// <summary>
  51. /// 更新保存课程
  52. /// </summary>
  53. /// <param name="request"></param>
  54. /// <returns></returns>
  55. [ProducesDefaultResponseType]
  56. [AuthToken(Roles = "teacher,admin",Permissions = "course-upd,course-read")]
  57. [HttpPost("manage")]
  58. #if !DEBUG
  59. [Authorize(Roles = "IES")]
  60. #endif
  61. public async Task<IActionResult> Manage(JsonElement request)
  62. {
  63. try
  64. {
  65. (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
  66. if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
  67. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  68. var client = _azureCosmos.GetCosmosClient();
  69. switch (true)
  70. {
  71. case bool when $"{grant_type}".Equals("list", StringComparison.OrdinalIgnoreCase):
  72. {
  73. if (!request.TryGetProperty("code", out JsonElement _code))
  74. {
  75. return BadRequest();
  76. }
  77. if (!request.TryGetProperty("periodId", out JsonElement _periodId)) return BadRequest();
  78. string tbname = $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
  79. string partitionKey = $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? $"CourseBase-{_code}": "CourseBase";
  80. string baseSql = $"select value c from c where c.period.id='{_periodId}'";
  81. List<CourseBase> courseBases = new List<CourseBase>();
  82. HashSet<string>teacherIds = new HashSet<string>();
  83. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname)
  84. .GetItemQueryIteratorSql<CourseBase>(queryText: baseSql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(partitionKey) }))
  85. {
  86. if (!string.IsNullOrWhiteSpace(item.creatorId)) {
  87. teacherIds.Add(item.creatorId);
  88. }
  89. courseBases.Add(item);
  90. }
  91. List<IdNameCode> teachers = new List<IdNameCode>();
  92. if (teacherIds.Count>0) {
  93. string teacherSQLBase = $"select c.id,c.name,c.picture from c where c.id in ({string.Join(",", teacherIds.Select(z => $"'{z}'"))}) ";
  94. var resultBase = await client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<IdNameCode>(teacherSQLBase, $"Base");
  95. teachers = resultBase.list;
  96. if (teacherIds.Count()>resultBase.list.Count)
  97. {
  98. var more = teacherIds.Except(resultBase.list.Select(z => z.id));
  99. var content = new StringContent(more.ToJsonString(), Encoding.UTF8, "application/json");
  100. string json = await _coreAPIHttpService.GetUserInfos(content);
  101. if (!string.IsNullOrWhiteSpace(json))
  102. {
  103. List<CoreUser> coreUsers = json.ToObject<List<CoreUser>>();
  104. teachers.AddRange(coreUsers.Select(c => new IdNameCode { id =c.id, name =c.name, picture=c.picture }));
  105. }
  106. }
  107. }
  108. int studyYear = -1;
  109. string semesterId = string.Empty;
  110. if ($"{scope}".Equals("school")) {
  111. if (!request.TryGetProperty("year", out JsonElement _year) || !request.TryGetProperty("semesterId", out JsonElement _semesterId))
  112. {
  113. //如果没传,则以当前时间获取学年和学期信息
  114. School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  115. var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
  116. (Semester currSemester, int studyYear, DateTimeOffset currSemesterDate, DateTimeOffset date, DateTimeOffset nextSemester) info = SchoolService.GetSemester(period);
  117. semesterId = info.currSemester.id;
  118. studyYear = info.studyYear;
  119. }
  120. else
  121. {
  122. studyYear = _year.GetInt32();
  123. semesterId=_semesterId.GetString();
  124. }
  125. var ids = courseBases.Select(z=>$"'{studyYear}-{semesterId}-{z.id}'");
  126. if (ids!=null && ids.Count()>0) {
  127. string taskCode = $"CourseTask-{school}";
  128. string sql = $"select value c from c where c.id in ({string.Join(",", ids)})";
  129. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).GetList<CourseTask>(sql, taskCode);
  130. foreach (var rs in result.list) {
  131. var courseBase= courseBases.Find(z => z.id.Equals(rs.courseId));
  132. if (courseBase!=null) {
  133. courseBase.count= rs.schedules.Count();
  134. }
  135. }
  136. }
  137. }
  138. foreach (var z in courseBases) {
  139. var teacher = teachers.Find(x => x.id.Equals(z.creatorId));
  140. if (teacher!= null)
  141. {
  142. z.creatorName=teacher.name;
  143. z.creatorPicture=teacher.picture;
  144. }
  145. }
  146. return Ok(new { courseBases = courseBases.OrderByDescending(z => z._ts) });
  147. }
  148. case bool when $"{grant_type}".Equals("delete", StringComparison.OrdinalIgnoreCase):
  149. {
  150. if (!request.TryGetProperty("id", out JsonElement _id) || !request.TryGetProperty("code", out JsonElement _code))
  151. {
  152. return BadRequest();
  153. }
  154. string tbname = $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
  155. string partitionKey = $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? $"CourseBase-{_code}" : "CourseBase";
  156. var response = await client.GetContainer(Constant.TEAMModelOS, tbname).DeleteItemStreamAsync(_id.ToString(), new PartitionKey(partitionKey));
  157. //需要联动删除排课
  158. string taskCode = $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? $"CourseTask-{_code}": "CourseTask";
  159. string taskSql = $"select value c from c where c.courseId='{_id}'";
  160. List<CourseTask> courseTasks = new List<CourseTask>();
  161. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname)
  162. .GetItemQueryIteratorSql<CourseTask>(queryText: taskSql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(taskCode) }))
  163. {
  164. courseTasks.Add(item);
  165. }
  166. if (courseTasks.Count > 0)
  167. {
  168. await client.GetContainer(Constant.TEAMModelOS, tbname).DeleteItemsStreamAsync(courseTasks.Select(x => x.id).ToList(), taskCode);
  169. }
  170. return Ok(new { code = response.StatusCode });
  171. }
  172. case bool when $"{grant_type}".Equals("import-base", StringComparison.OrdinalIgnoreCase) && $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase):
  173. {
  174. if (!request.TryGetProperty("courses", out JsonElement _courses))
  175. {
  176. return BadRequest();
  177. }
  178. if (!request.TryGetProperty("periodId", out JsonElement _periodId)) return BadRequest();
  179. List<CourseBase> courseBases = _courses.ToObject<List<CourseBase>>();
  180. var noNo = courseBases.Where(x => string.IsNullOrWhiteSpace(x.no));
  181. if (noNo!=null &&noNo.Count()>0)
  182. {
  183. return Ok(new { code = 5, msg = "课程编号为空", courses = noNo });
  184. }
  185. var noName = courseBases.Where(x => string.IsNullOrWhiteSpace(x.name));
  186. if (noName!=null &&noName.Count()>0)
  187. {
  188. return Ok(new { code = 6, msg = "课程名称,年级", courses = noName });
  189. }
  190. //1.检查导入的课程名称是否有效
  191. StringBuilder sqlNo = new StringBuilder(" select value c from c ");
  192. sqlNo.Append($" where c.no in( {string.Join(",", courseBases.Select(z => $"'{z.no}'"))} ) and c.period.id='{_periodId}' ");
  193. string tbname = Constant.School;
  194. List<CourseBase> courseBasesDB = new List<CourseBase>();
  195. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname)
  196. .GetItemQueryIteratorSql<CourseBase>(queryText: sqlNo.ToString(), requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"CourseBase-{school}") }))
  197. {
  198. courseBasesDB.Add(item);
  199. }
  200. if (courseBasesDB.IsNotEmpty())
  201. {
  202. courseBases.RemoveAll(x => courseBasesDB.Select(y => y.no).Contains(x.no));
  203. }
  204. List<CourseBase> courseNameDuplicate = new List<CourseBase>();
  205. School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  206. var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
  207. if (period != null)
  208. {
  209. foreach (var item in courseBases)
  210. {
  211. item.pk = "CourseBase";
  212. if (string.IsNullOrWhiteSpace(item.id))
  213. {
  214. item.id = Guid.NewGuid().ToString();
  215. }
  216. item.scope = "school";
  217. item.school = school;
  218. item.creatorId = tmdid;
  219. item.code = $"CourseBase-{school}";
  220. item.period = new IdName { id = period.id, name = period.name };
  221. if (!string.IsNullOrWhiteSpace(item.subject?.id))
  222. {
  223. var subject = period.subjects.Find(x => x.id.Equals(item.subject.id));
  224. if (subject != null)
  225. {
  226. item.subject.name = subject.name;
  227. }
  228. else
  229. {
  230. return Ok(new { code = 1, msg = "科目不存在", course = item });
  231. }
  232. }
  233. else
  234. {
  235. return Ok(new { code = 1, msg = "科目不存在", course = item });
  236. }
  237. if (!string.IsNullOrWhiteSpace(item.major?.id))
  238. {
  239. var major = period.majors.Find(x => x.id.Equals(item.major.id));
  240. if (major != null)
  241. {
  242. item.major.name = major.name;
  243. }
  244. else
  245. {
  246. return Ok(new { code = 2, msg = "专业不存在", course = item });
  247. }
  248. }
  249. StringBuilder sqlName = new StringBuilder(" select value c from c ");
  250. sqlName.Append($" where c.name='{item.name}' and c.grade={item.grade} and c.period.id='{_periodId}' ");
  251. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseBase>(sqlName.ToString(), item.code);
  252. if (result.list.IsNotEmpty())
  253. {
  254. courseNameDuplicate.Add(item);
  255. }
  256. else { await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).UpsertItemAsync(item, new PartitionKey(item.code)); }
  257. }
  258. return Ok(new { course = courseBases, courseNoDuplicate = courseBasesDB, courseNameDuplicate });
  259. }
  260. else
  261. {
  262. return Ok(new { code = 3, msg = "学段不存在", });
  263. }
  264. }
  265. case bool when $"{grant_type}".Equals("upsert", StringComparison.OrdinalIgnoreCase):
  266. {
  267. if (!request.TryGetProperty("course", out JsonElement _course))
  268. {
  269. return BadRequest();
  270. }
  271. CourseBase courseBase = _course.ToObject<CourseBase>();
  272. courseBase.pk = "CourseBase";
  273. string tbname = $"{courseBase.scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
  274. //1.检查导入的课程名称是否有效
  275. StringBuilder sqlCourse = new StringBuilder(" select value c from c ");
  276. if (courseBase.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
  277. {
  278. courseBase.school = school;
  279. courseBase.creatorId = tmdid;
  280. courseBase.code = $"CourseBase-{school}";
  281. if (string.IsNullOrWhiteSpace(courseBase.subject?.id) ||courseBase.grade<0)
  282. {
  283. return BadRequest();
  284. }
  285. if (string.IsNullOrWhiteSpace(courseBase.period?.id))
  286. {
  287. return BadRequest();
  288. }
  289. else
  290. {
  291. if (string.IsNullOrWhiteSpace(courseBase.id))
  292. {
  293. if (string.IsNullOrWhiteSpace(courseBase.no))
  294. {
  295. School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  296. var period = schoolBase.period.Find(x => x.id.Equals($"{courseBase.period.id}"));
  297. //生成新的课程编号
  298. string sqlNo = $"select value c.no from c where c.period.id='{courseBase.period.id}' ";
  299. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).GetList<string>(sqlNo, courseBase.code);
  300. if (result.list.IsNotEmpty())
  301. {
  302. int index = period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))+1;
  303. var nos = result.list.FindAll(x => !string.IsNullOrWhiteSpace(x) && x.StartsWith($"{index}")).ToHashSet<string>();
  304. if (nos != null)
  305. {
  306. string couresNo = string.Empty;
  307. List<string> order = nos.Where(y => !string.IsNullOrEmpty(y) && Regex.IsMatch(y, @"^\d*$")).OrderBy(x => int.Parse(x)).ToList();
  308. if (!order.Contains($"{index}00"))
  309. {
  310. order.Insert(0, $"{index}00");
  311. }
  312. if (order != null)
  313. {
  314. if (!order.Contains($"{index}00"))
  315. {
  316. order.Insert(0, $"{index}00");
  317. }
  318. }
  319. else { order = new List<string>() { $"{index}00" }; }
  320. for (int i = 0; i < order.Count; i++)
  321. {
  322. couresNo = $"{int.Parse(order[i]) + 1}";
  323. int no = i + 1;
  324. if (no <= order.Count - 1)
  325. {
  326. if (!couresNo.Equals(order[no]))
  327. {
  328. break;
  329. }
  330. }
  331. }
  332. if (string.IsNullOrWhiteSpace(couresNo))
  333. {
  334. couresNo=$"{index}99";
  335. }
  336. courseBase.no=couresNo;
  337. }
  338. else
  339. {
  340. courseBase.no= $"{index}01";
  341. }
  342. }
  343. else
  344. {
  345. courseBase.no= $"{(period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))+1)}01";
  346. }
  347. }
  348. }
  349. else
  350. {
  351. if (string.IsNullOrWhiteSpace(courseBase.no))
  352. {
  353. //编辑时,编号不能为空
  354. return Ok(new { code = 6, course = courseBase });
  355. }
  356. }
  357. sqlCourse.Append($" where c.no ='{courseBase.no}' ");
  358. sqlCourse.Append($" and c.period.id='{courseBase.period.id}' ");
  359. }
  360. }
  361. else
  362. {
  363. sqlCourse.Append($" where c.name ='{courseBase.name}' and c.creatorId='{tmdid}' ");
  364. courseBase.creatorId = tmdid;
  365. courseBase.code = $"CourseBase";
  366. }
  367. List<CourseBase> courseBases = new List<CourseBase>();
  368. try {
  369. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname)
  370. .GetItemQueryIteratorSql<CourseBase>(queryText: sqlCourse.ToString(), requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(courseBase.code) }))
  371. {
  372. if (courseBase.scope.Equals(item.scope))
  373. {
  374. if (courseBase.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
  375. {
  376. //不是同一条数据,但是编号相同,则判定编号重复。
  377. if (!string.IsNullOrWhiteSpace(courseBase.id))
  378. {
  379. if (!item.id.Equals(courseBase.id) && item.no.Equals(courseBase.no))
  380. {
  381. return Ok(new { code = 4, course = courseBase });
  382. }
  383. }
  384. else
  385. {
  386. if (item.no.Equals(courseBase.no))
  387. {
  388. return Ok(new { code = 4, course = courseBase });
  389. }
  390. }
  391. }
  392. else
  393. {
  394. //不是同一条数据,但是名称相同,则判定名字重复。
  395. if (!item.id.Equals(courseBase.id) && item.name.Equals(courseBase.name))
  396. {
  397. return Ok(new { code = 5, course = courseBase });
  398. }
  399. }
  400. }
  401. }
  402. } catch (Exception ex) {
  403. await _dingDing.SendBotMsg($"{_option.Location},执行课程更新异常{sqlCourse}\n{ex.Message},{ex.StackTrace}", GroupNames.成都开发測試群組);
  404. }
  405. if (courseBase.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
  406. {
  407. string sqlNameGrade = $"select value c from c where c.name ='{courseBase.name}' and c.grade={courseBase.grade} and c.period.id='{courseBase.period.id}' ";
  408. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname)
  409. .GetItemQueryIteratorSql<CourseBase>(queryText: sqlNameGrade, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(courseBase.code) }))
  410. {
  411. //不是同一条数据,但是名字年级重复
  412. if (!string.IsNullOrWhiteSpace(courseBase.id))
  413. {
  414. if (!item.id.Equals(courseBase.id) && item.name.Equals(courseBase.name) && item.grade== courseBase.grade)
  415. {
  416. //名字和年级重复
  417. return Ok(new { code = 5, course = courseBase });
  418. }
  419. }
  420. else
  421. {
  422. if (item.name.Equals(courseBase.name) && item.grade== courseBase.grade)
  423. {
  424. //名字和年级重复
  425. return Ok(new { code = 5, course = courseBase });
  426. }
  427. }
  428. }
  429. }
  430. if (string.IsNullOrWhiteSpace(courseBase.id))
  431. {
  432. courseBase.id = Guid.NewGuid().ToString();
  433. }
  434. await client.GetContainer(Constant.TEAMModelOS, tbname).UpsertItemAsync(courseBase, new PartitionKey(courseBase.code));
  435. try
  436. {
  437. Teacher teacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<Teacher>(courseBase.creatorId, new PartitionKey("Base"));
  438. courseBase.creatorName= teacher.name;
  439. courseBase.creatorPicture=teacher.picture;
  440. } catch {
  441. courseBase.creatorName=courseBase.creatorId;
  442. }
  443. return Ok(new { code = 200, course = courseBase });
  444. }
  445. case bool when $"{grant_type}".Equals("read-task", StringComparison.OrdinalIgnoreCase):
  446. {
  447. if (!request.TryGetProperty("courseId", out JsonElement _courseId)) return BadRequest();
  448. string tbname = $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
  449. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  450. {
  451. if (!request.TryGetProperty("periodId", out JsonElement _periodId)) return BadRequest();
  452. int studyYear = -1;
  453. string semesterId = string.Empty;
  454. School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  455. var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
  456. if (!request.TryGetProperty("year", out JsonElement _year) || !request.TryGetProperty("semesterId", out JsonElement _semesterId))
  457. {
  458. //如果没传,则以当前时间获取学年和学期信息
  459. (Semester currSemester, int studyYear, DateTimeOffset currSemesterDate, DateTimeOffset date, DateTimeOffset nextSemester) info = SchoolService.GetSemester(period);
  460. semesterId = info.currSemester.id;
  461. studyYear = info.studyYear;
  462. }
  463. else
  464. {
  465. studyYear = _year.GetInt32();
  466. semesterId=_semesterId.GetString();
  467. }
  468. HashSet<string> groupIds = new HashSet<string>();
  469. HashSet<string> teacherIds = new HashSet<string>();
  470. HashSet<string> roomIds = new HashSet<string>();
  471. List<GroupListDto> groups = new List<GroupListDto>();
  472. string taskCode = $"CourseTask-{school}";
  473. string taskId = $"{studyYear}-{semesterId}-{_courseId}";
  474. ResponseMessage response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).ReadItemStreamAsync(taskId, new PartitionKey(taskCode));
  475. bool has_schedule = false;
  476. CourseTask courseTask = default;
  477. if (response.StatusCode == System.Net.HttpStatusCode.OK)
  478. {
  479. courseTask=JsonDocument.Parse(response.Content).RootElement.ToObject<CourseTask>();
  480. if (courseTask != null && courseTask.schedules.IsNotEmpty())
  481. {
  482. foreach (var schedule in courseTask.schedules) {
  483. if (!string.IsNullOrWhiteSpace(schedule.groupId))
  484. {
  485. groupIds.Add(schedule.groupId);
  486. }
  487. if (!string.IsNullOrWhiteSpace(schedule.teacherId))
  488. {
  489. teacherIds.Add(schedule.teacherId);
  490. }
  491. if (!string.IsNullOrWhiteSpace(schedule.roomId))
  492. {
  493. roomIds.Add(schedule.roomId);
  494. }
  495. if (schedule.assistants!=null && schedule.assistants.Count>0) {
  496. teacherIds.UnionWith(schedule.assistants);
  497. }
  498. }
  499. has_schedule = true;
  500. }
  501. }
  502. //匹配建议的班级和教师
  503. List<Class> classes = new List<Class>();
  504. List<SchoolTeacher> teachers = new List<SchoolTeacher>();
  505. List<IdNameCode> teachersBases = new List<IdNameCode>();
  506. if (!has_schedule)
  507. {
  508. //如果没有找到排课安排信息。则可以进行建议升学年方式处理
  509. CourseBase courseBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<CourseBase>(_courseId.ToString(), new PartitionKey($"CourseBase-{school}"));
  510. if (courseBase.grade>=0)
  511. {
  512. var yearsdata = SchoolService.GetYears(schoolBase, _periodId.ToString(), new List<int> { courseBase.grade });
  513. List<int> years = yearsdata.years.ToList();
  514. if (years.IsNotEmpty())
  515. {
  516. StringBuilder sql = new StringBuilder($"select value c from c where c.year in ({string.Join(",", years)}) and c.periodId='{_periodId}' ");
  517. var result = await client.GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Class>(sql.ToString(), $"Class-{school}");
  518. classes = result.list;
  519. }
  520. }
  521. if (!string.IsNullOrWhiteSpace(courseBase.subject?.id))
  522. {
  523. string teacherSQL = $"select distinct value c from c join b in c.subjectIds where b in ('{courseBase.subject.id}') and c.code = 'Teacher-{school}'";
  524. var result = await client.GetContainer(Constant.TEAMModelOS, Constant.School).GetList<SchoolTeacher>(teacherSQL, $"Teacher-{school}");
  525. teachers = result.list;
  526. }
  527. }else
  528. {
  529. var groupList = await GroupListService.GetMemberByListids(_coreAPIHttpService,_azureCosmos.GetCosmosClient(), _dingDing, groupIds.ToList(), school);
  530. groups= groupList.groups.Select(z => new GroupListDto(z)).ToList();
  531. string teacherSQLBase = $"select c.id,c.name,c.picture from c where c.id in ({string.Join(",", teacherIds.Select(z => $"'{z}'"))}) ";
  532. var resultBase = await client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<IdNameCode>(teacherSQLBase, $"Base");
  533. teachersBases = resultBase.list;
  534. if (teacherIds.Count()>resultBase.list.Count) {
  535. var more = teacherIds.Except(resultBase.list.Select(z => z.id));
  536. var content = new StringContent(more.ToJsonString(), Encoding.UTF8, "application/json");
  537. string json = await _coreAPIHttpService.GetUserInfos(content);
  538. if (!string.IsNullOrWhiteSpace(json))
  539. {
  540. List<CoreUser> coreUsers = json.ToObject<List<CoreUser>>();
  541. teachersBases.AddRange(coreUsers.Select(c => new IdNameCode {id =c.id,name =c.name,picture=c.picture }));
  542. }
  543. }
  544. }
  545. int count = 0;
  546. if (groups.IsNotEmpty())
  547. {
  548. count = courseTask.schedules.RemoveAll(z => !string.IsNullOrWhiteSpace(z.groupId) && !groups.Select(v => v.id).Contains(z.groupId));
  549. if (count>0)
  550. {
  551. await client.GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(courseTask, new PartitionKey(courseTask.code));
  552. }
  553. }
  554. else {
  555. if (has_schedule) {
  556. count = courseTask.schedules.RemoveAll(z => !string.IsNullOrWhiteSpace(z.groupId) );
  557. //排课任务的所有名单都不在。
  558. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).DeleteItemStreamAsync(courseTask.id, new PartitionKey(courseTask.code));
  559. }
  560. }
  561. //当courseTask 为空,则matchedClasses可能会有年级匹配建议升学年的班级清单,
  562. //注:比如高二可能会将高三的课程学完,则该高三的课程的学年级应该是手动处理为高中二年级。不区分学期的目的,也是可能存在提前一学期学完第二学期的课程。
  563. return Ok(new {count= count, studyYear, semesterId, courseTask, teachers= teachersBases, groups, matchedClasses = classes, matchedTeachers = teachers.Select(z => new { z.id, z.name, z.subjectIds, z.job, z.periodId, z.picture }) });
  564. }
  565. else
  566. {
  567. string taskCode = $"CourseTask";
  568. string taskId = $"{_courseId}";
  569. ResponseMessage response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).ReadItemStreamAsync(taskId, new PartitionKey(taskCode));
  570. CourseTask courseTask = default;
  571. if (response.StatusCode == System.Net.HttpStatusCode.OK)
  572. {
  573. courseTask = JsonDocument.Parse(response.Content).RootElement.ToObject<CourseTask>();
  574. }
  575. return Ok(new { courseTask });
  576. }
  577. }
  578. case bool when $"{grant_type}".Equals("upsert-scheduleTask", StringComparison.OrdinalIgnoreCase):
  579. {
  580. List<ScheduleTaskDto> invalidCourseTask = new List<ScheduleTaskDto>();
  581. JsonElement _year = default, _semesterId = default, _courseId = default, _periodId = default;
  582. if (!request.TryGetProperty("courseId", out _courseId))
  583. {
  584. return BadRequest();
  585. }
  586. if (!request.TryGetProperty("datas", out JsonElement _datas))
  587. {
  588. return BadRequest();
  589. }
  590. if ($"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase))
  591. {
  592. if (!request.TryGetProperty("periodId", out _periodId)) return BadRequest();
  593. if (!request.TryGetProperty("year", out _year))
  594. {
  595. return BadRequest();
  596. }
  597. if (!request.TryGetProperty("semesterId", out _semesterId))
  598. {
  599. return BadRequest();
  600. }
  601. }
  602. string tbname = $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
  603. List<ScheduleTaskDto> datas = _datas.ToObject<List<ScheduleTaskDto>>();
  604. //过滤掉名单,教师空的数据
  605. var invalids = datas.FindAll(z => string.IsNullOrWhiteSpace(z.teacherId) || string.IsNullOrWhiteSpace(z.groupId) || string.IsNullOrWhiteSpace(z.type));
  606. if (invalids != null)
  607. {
  608. datas.RemoveAll(z => string.IsNullOrWhiteSpace(z.teacherId) || string.IsNullOrWhiteSpace(z.groupId) || string.IsNullOrWhiteSpace(z.type));
  609. foreach (var invalid in invalids)
  610. {
  611. if (string.IsNullOrWhiteSpace(invalid.groupId) || string.IsNullOrWhiteSpace(invalid.type))
  612. {
  613. invalid.invalidCode = 3;
  614. }
  615. if (string.IsNullOrWhiteSpace(invalid.teacherId))
  616. {
  617. invalid.invalidCode = 2;
  618. }
  619. invalidCourseTask.Add(invalid);
  620. }
  621. }
  622. var groups = datas.GroupBy(z => new { z.teacherId, z.groupId }).Select(x => new { key = x.Key, list = x.ToList() });
  623. foreach (var item in groups)
  624. {
  625. if (item.list.Count > 1)
  626. {
  627. return Ok(new { invalidCourseTask = item.list.Select(z => z.invalidCode=20) });//同一教师,同一班级,同一课程,只能有一条记录
  628. }
  629. }
  630. HashSet<CourseTask> courseTasks = new HashSet<CourseTask>();
  631. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  632. {
  633. string taskCode = $"CourseTask-{school}";
  634. string taskId = $"{_year}-{_semesterId}-{_courseId}";
  635. CourseTask courseTask = null;
  636. School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  637. var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
  638. //学年
  639. if (int.Parse(_year.ToString()) < 2000)
  640. {
  641. return Ok(new { invalidCode = 17 });//学年应大于2000
  642. }
  643. //学期
  644. var semester = period.semesters.Where(z => z.id.Equals(_semesterId.ToString()));
  645. if (!semester.Any())
  646. {
  647. return Ok(new { invalidCode = 16 });//学期不存在
  648. }
  649. CourseBase courseBase = null;
  650. ResponseMessage responseBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync($"{_courseId.ToString()}", new PartitionKey($"CourseBase-{school}"));
  651. if (responseBase.StatusCode == System.Net.HttpStatusCode.OK)
  652. {
  653. courseBase = JsonDocument.Parse(responseBase.Content).RootElement.ToObject<CourseBase>();
  654. }
  655. else
  656. {
  657. return Ok(new { invalidCode = 1 });//课程不存在
  658. }
  659. ResponseMessage response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(taskId, new PartitionKey(taskCode));
  660. if (response.StatusCode == System.Net.HttpStatusCode.OK)
  661. {
  662. courseTask = JsonDocument.Parse(response.Content).RootElement.ToObject<CourseTask>();
  663. }
  664. else
  665. {
  666. courseTask = new CourseTask
  667. {
  668. id = taskId,
  669. code = taskCode,
  670. pk = "CourseTask",
  671. ttl = -1,
  672. courseId = _courseId.ToString(),
  673. year = int.Parse(_year.ToString()),
  674. semesterId = _semesterId.ToString(),
  675. };
  676. }
  677. //获取相关的名单
  678. List<GroupListDto> groupListDtos = await GroupListService.GetGroupListByListids(client, _dingDing, datas.Select(z => z.groupId).ToHashSet().ToList(), school);
  679. //获取相关的教室
  680. var roomIds = datas.Where(x => !string.IsNullOrWhiteSpace(x.roomId)).Select(c => $"'{c.roomId}'");
  681. List<Room> rooms = new List<Room>();
  682. if (roomIds.Any())
  683. {
  684. string sqlRoom = $"select value c from c where c.id in ({string.Join(",", roomIds)})";
  685. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Room>(sqlRoom, $"Room-{school}");
  686. if (result.list.IsNotEmpty())
  687. {
  688. rooms.AddRange(result.list);
  689. }
  690. }
  691. //获取教师
  692. List<SchoolTeacher> schoolTeachers = new List<SchoolTeacher>();
  693. var teacherIds = datas.Where(x => !string.IsNullOrWhiteSpace(x.teacherId)).Select(c => c.teacherId);
  694. var assistants = datas.SelectMany(x => x.assistants);
  695. teacherIds = teacherIds.Union(assistants).ToHashSet();
  696. if (teacherIds.Any())
  697. {
  698. string sqlTeacher = $"select value c from c where c.id in ({string.Join(",", teacherIds.Select(x => $"'{x}'"))}) ";
  699. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<SchoolTeacher>(sqlTeacher, $"Teacher-{school}");
  700. if (result.list.IsNotEmpty())
  701. {
  702. schoolTeachers.AddRange(result.list);
  703. }
  704. }
  705. foreach (var data in datas)
  706. {
  707. var courseTaskInsert = SchoolService.CheckCourseTask($"{scope}", data, school, groupListDtos, rooms, schoolTeachers, null);
  708. if (courseTaskInsert.invalidCode == 0)
  709. {
  710. var scheduleTask = courseTask.schedules.Find(z => z.type.Equals(courseTaskInsert.type) && z.groupId.Equals(courseTaskInsert.groupId));
  711. if (scheduleTask == null)
  712. {
  713. scheduleTask = new ScheduleTask()
  714. {
  715. roomId = courseTaskInsert.roomId,
  716. groupId = courseTaskInsert.groupId,
  717. type = courseTaskInsert.type,
  718. teacherId = courseTaskInsert.teacherId,
  719. times = new List<ScheduleTime>(),
  720. school = school,
  721. assistants = courseTaskInsert.assistants != null ? courseTaskInsert.assistants : new HashSet<string>()
  722. };
  723. courseTask.schedules.Add(scheduleTask);
  724. //新增
  725. }
  726. else
  727. {
  728. //编辑
  729. scheduleTask.roomId = courseTaskInsert.roomId;
  730. scheduleTask.school = school;
  731. scheduleTask.teacherId = courseTaskInsert.teacherId;
  732. scheduleTask.startTime= courseTaskInsert.startTime>0 ? courseTaskInsert.startTime : scheduleTask.startTime;
  733. scheduleTask.notice=string.IsNullOrWhiteSpace(courseTaskInsert.notice) ? scheduleTask.notice : courseTaskInsert.notice;
  734. scheduleTask.assistants= courseTaskInsert.assistants!=null ? courseTaskInsert.assistants : scheduleTask.assistants;
  735. }
  736. //如果被删除完了,就删除该条记录。
  737. if (courseTask.schedules.Count <= 0)
  738. {
  739. courseTasks.Remove(courseTask);
  740. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).DeleteItemStreamAsync(courseTask.id, new PartitionKey(courseTask.code));
  741. }
  742. else
  743. {
  744. courseTasks.Add(courseTask);
  745. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(courseTask, new PartitionKey(taskCode));
  746. }
  747. }
  748. else
  749. {
  750. invalidCourseTask.Add(courseTaskInsert);
  751. }
  752. }
  753. }
  754. else
  755. {
  756. string taskCode = $"CourseTask";
  757. string taskId = $"{_courseId}";
  758. CourseTask courseTask = null;
  759. CourseBase courseBase = null;
  760. ResponseMessage responseBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync($"{_courseId.ToString()}", new PartitionKey($"CourseBase"));
  761. if (responseBase.StatusCode==System.Net.HttpStatusCode.OK)
  762. {
  763. courseBase = JsonDocument.Parse(responseBase.Content).RootElement.ToObject<CourseBase>();
  764. }
  765. else
  766. {
  767. return Ok(new { invalidCode = 1 });//课程不存在
  768. }
  769. ResponseMessage response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync(taskId, new PartitionKey(taskCode));
  770. if (response.StatusCode==System.Net.HttpStatusCode.OK)
  771. {
  772. courseTask = JsonDocument.Parse(response.Content).RootElement.ToObject<CourseTask>();
  773. }
  774. else
  775. {
  776. courseTask = new CourseTask
  777. {
  778. id = taskId,
  779. code = taskCode,
  780. pk = "CourseTask",
  781. ttl = -1,
  782. courseId = _courseId.ToString(),
  783. year = int.Parse(_year.ToString()),
  784. semesterId = _semesterId.ToString(),
  785. };
  786. }
  787. //获取相关的名单
  788. List<GroupListDto> groupListDtos = await GroupListService.GetGroupListByListids(client, _dingDing, datas.Select(z => z.groupId).ToHashSet().ToList(), school);
  789. //获取相关的教室
  790. var roomIds = datas.Where(x => !string.IsNullOrWhiteSpace(x.roomId)).Select(c => $"'{c.roomId}'");
  791. List<Room> rooms = new List<Room>();
  792. if (roomIds.Any() && !string.IsNullOrWhiteSpace(school))
  793. {
  794. string sqlRoom = $"select value c from c where c.id in ({string.Join(",", roomIds)})";
  795. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Room>(sqlRoom, $"Room-{school}");
  796. if (result.list.IsNotEmpty())
  797. {
  798. rooms.AddRange(result.list);
  799. }
  800. }
  801. //获取教师
  802. List<Teacher> teachers = new List<Teacher>();
  803. var teacherIds = datas.Where(x => !string.IsNullOrWhiteSpace(x.teacherId)).Select(x => x.teacherId);
  804. var assistants = datas.SelectMany(x => x.assistants);
  805. teacherIds = teacherIds.Union(assistants).ToHashSet();
  806. if (teacherIds.Any())
  807. {
  808. string sqlTeacher = $"select value c from c where c.id in ({string.Join(",", teacherIds.Select(x => $"'{x}'"))}) ";
  809. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<Teacher>(sqlTeacher, $"Base");
  810. if (result.list.IsNotEmpty())
  811. {
  812. teachers.AddRange(result.list);
  813. }
  814. }
  815. foreach (var data in datas)
  816. {
  817. var courseTaskInsert = SchoolService.CheckCourseTask($"{scope}", data, school, groupListDtos, rooms, null, teachers);
  818. if (courseTaskInsert.invalidCode == 0)
  819. {
  820. var scheduleTask = courseTask.schedules.Find(z => z.type.Equals(courseTaskInsert.type) && z.groupId.Equals(courseTaskInsert.groupId));
  821. if (scheduleTask == null)
  822. {
  823. scheduleTask = new ScheduleTask()
  824. {
  825. roomId = courseTaskInsert.roomId,
  826. groupId = courseTaskInsert.groupId,
  827. type = courseTaskInsert.type,
  828. teacherId = courseTaskInsert.teacherId,
  829. times = new List<ScheduleTime>(),
  830. school = school,
  831. };
  832. courseTask.schedules.Add(scheduleTask);
  833. //新增
  834. }
  835. else
  836. {
  837. //编辑
  838. scheduleTask.roomId = courseTaskInsert.roomId;
  839. scheduleTask.school = school;
  840. scheduleTask.teacherId = courseTaskInsert.teacherId;
  841. scheduleTask.startTime = courseTaskInsert.startTime > 0 ? courseTaskInsert.startTime : scheduleTask.startTime;
  842. scheduleTask.notice = string.IsNullOrWhiteSpace(courseTaskInsert.notice) ? scheduleTask.notice : courseTaskInsert.notice;
  843. scheduleTask.assistants = courseTaskInsert.assistants != null ? courseTaskInsert.assistants : courseTaskInsert.assistants;
  844. }
  845. //如果被删除完了,就删除该条记录。
  846. if (courseTask.schedules.Count <= 0)
  847. {
  848. courseTasks.Remove(courseTask);
  849. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).DeleteItemStreamAsync(courseTask.id, new PartitionKey(courseTask.code));
  850. }
  851. else
  852. {
  853. courseTasks.Add(courseTask);
  854. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(courseTask, new PartitionKey(taskCode));
  855. }
  856. }
  857. else
  858. {
  859. invalidCourseTask.Add(courseTaskInsert);
  860. }
  861. }
  862. }
  863. return Ok(new { invalidCourseTask, courseTasks });
  864. }
  865. case bool when $"{grant_type}".Equals("insert-scheduleTask", StringComparison.OrdinalIgnoreCase)
  866. || $"{grant_type}".Equals("change-scheduleTask", StringComparison.OrdinalIgnoreCase)
  867. || $"{grant_type}".Equals("delete-scheduleTask", StringComparison.OrdinalIgnoreCase):
  868. {
  869. if (!request.TryGetProperty("datas", out JsonElement _datas))
  870. {
  871. return BadRequest();
  872. }
  873. string tbname = $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
  874. List<CourseTaskChanged> datas = _datas.ToObject<List<CourseTaskChanged>>();
  875. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  876. {
  877. if (!request.TryGetProperty("periodId", out JsonElement _periodId)) return BadRequest();
  878. //获取相关的名单
  879. List<GroupListDto> groupListDtos = await GroupListService.GetGroupListByListids(client, _dingDing, datas.Select(z => z.groupId).ToHashSet().ToList(), school);
  880. //获取相关的教室
  881. var roomIds = datas.Where(x => !string.IsNullOrWhiteSpace(x.roomId)).Select(c => $"'{c.roomId}'");
  882. List<Room> rooms = new List<Room>();
  883. if (roomIds.Any())
  884. {
  885. string sqlRoom = $"select value c from c where c.id in ({string.Join(",", roomIds)})";
  886. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Room>(sqlRoom, $"Room-{school}");
  887. if (result.list.IsNotEmpty())
  888. {
  889. rooms.AddRange(result.list);
  890. }
  891. }
  892. //获取教师
  893. List<SchoolTeacher> schoolTeachers = new List<SchoolTeacher>();
  894. var teacherIds = datas.Where(x => !string.IsNullOrWhiteSpace(x.teacherId)).Select(c => $"'{c.teacherId}'");
  895. if (teacherIds.Any())
  896. {
  897. string sqlTeacher = $"select value c from c where c.id in ({string.Join(",", teacherIds)}) ";
  898. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<SchoolTeacher>(sqlTeacher, $"Teacher-{school}");
  899. if (result.list.IsNotEmpty())
  900. {
  901. schoolTeachers.AddRange(result.list);
  902. }
  903. }
  904. //获取课程
  905. List<CourseBase> courseBases = new List<CourseBase>();
  906. var courseIds = datas.Where(x => !string.IsNullOrWhiteSpace(x.courseId)).Select(c => $"'{c.courseId}'");
  907. if (courseIds.Any())
  908. {
  909. string sqlCourse = $"select value c from c where c.id in ({string.Join(",", courseIds)}) ";
  910. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseBase>(sqlCourse, $"CourseBase-{school}");
  911. if (result.list.IsNotEmpty())
  912. {
  913. courseBases.AddRange(result.list);
  914. }
  915. }
  916. School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  917. var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
  918. HashSet<CourseTask> courseTasks = new HashSet<CourseTask>();
  919. List<CourseTaskChanged> invalidCourseTaskInsert = new List<CourseTaskChanged>();
  920. foreach (var data in datas)
  921. {
  922. var courseTaskInsert = SchoolService.CheckCourseTaskInsertOrChanged($"{grant_type}", scope.ToString(), data, school, period, courseBases, groupListDtos, rooms, schoolTeachers, null);
  923. if (courseTaskInsert.invalidCode == 0)
  924. {
  925. string taskCode = $"CourseTask-{school}";
  926. string taskId = $"{courseTaskInsert.year}-{courseTaskInsert.semesterId}-{courseTaskInsert.courseId}";
  927. CourseTask courseTask = courseTasks.Where(z => z.id.Equals(taskId) && z.code.Equals(taskCode)).FirstOrDefault();
  928. if (courseTask == null)
  929. {
  930. ResponseMessage response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(taskId, new PartitionKey(taskCode));
  931. if (response.StatusCode==System.Net.HttpStatusCode.OK)
  932. {
  933. courseTask = JsonDocument.Parse(response.Content).RootElement.ToObject<CourseTask>();
  934. }
  935. else
  936. {
  937. courseTask = new CourseTask
  938. {
  939. id = taskId,
  940. code = taskCode,
  941. pk = "CourseTask",
  942. ttl = -1,
  943. courseId = courseTaskInsert.courseId,
  944. year = courseTaskInsert.year,
  945. semesterId = courseTaskInsert.semesterId,
  946. schedules = new List<ScheduleTask> { new ScheduleTask {
  947. roomId = courseTaskInsert.roomId,
  948. groupId = courseTaskInsert.groupId,
  949. type = courseTaskInsert.type,
  950. teacherId = courseTaskInsert.teacherId,
  951. notice=courseTaskInsert.notice,
  952. startTime = courseTaskInsert.startTime,
  953. times= new List<ScheduleTime>(),
  954. school=school,
  955. } }
  956. };
  957. }
  958. }
  959. ScheduleTask scheduleTask = null;
  960. var scheduleTasks = courseTask.schedules.FindAll(z => z.type.Equals(courseTaskInsert.type) && z.groupId.Equals(courseTaskInsert.groupId));
  961. if (scheduleTasks.IsNotEmpty())
  962. {
  963. if (scheduleTasks.Count > 2)
  964. {
  965. courseTask.schedules.RemoveRange(1, scheduleTasks.Count - 1);
  966. }
  967. scheduleTask= scheduleTasks.First();
  968. scheduleTask.roomId = courseTaskInsert.roomId;
  969. scheduleTask.school = school;
  970. scheduleTask.teacherId = courseTaskInsert.teacherId;
  971. scheduleTask.startTime = courseTaskInsert.startTime > 0 ? courseTaskInsert.startTime : scheduleTask.startTime;
  972. scheduleTask.notice = string.IsNullOrWhiteSpace(courseTaskInsert.notice) ? scheduleTask.notice : courseTaskInsert.notice;
  973. scheduleTask.assistants = courseTaskInsert.assistants != null ? courseTaskInsert.assistants : courseTaskInsert.assistants;
  974. }
  975. else
  976. {
  977. scheduleTask = new ScheduleTask()
  978. {
  979. roomId = courseTaskInsert.roomId,
  980. groupId = courseTaskInsert.groupId,
  981. type = courseTaskInsert.type,
  982. teacherId = courseTaskInsert.teacherId,
  983. times = new List<ScheduleTime>(),
  984. school = school,
  985. };
  986. courseTask.schedules.Add(scheduleTask);
  987. }
  988. //修改教师或名单
  989. if (grant_type.ToString().Equals("change-scheduleTask", StringComparison.OrdinalIgnoreCase))
  990. {
  991. if (!string.IsNullOrWhiteSpace(courseTaskInsert.teacherIdChanged))
  992. {
  993. scheduleTask.teacherId = courseTaskInsert.teacherIdChanged;
  994. }
  995. if (!string.IsNullOrWhiteSpace(courseTaskInsert.typeChanged) && !string.IsNullOrWhiteSpace(courseTaskInsert.groupIdChanged))
  996. {
  997. scheduleTask.groupId = courseTaskInsert.groupIdChanged;
  998. scheduleTask.type = courseTaskInsert.typeChanged;
  999. }
  1000. }
  1001. //删除教师及名单的排课信息
  1002. if (grant_type.ToString().Equals("delete-scheduleTask", StringComparison.OrdinalIgnoreCase))
  1003. {
  1004. courseTask.schedules.Remove(scheduleTask);
  1005. }
  1006. //如果被删除完了,就删除该条记录。
  1007. if (courseTask.schedules.Count <= 0)
  1008. {
  1009. courseTasks.Remove(courseTask);
  1010. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).DeleteItemStreamAsync(courseTask.id, new PartitionKey(courseTask.code));
  1011. }
  1012. else
  1013. {
  1014. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(courseTask, new PartitionKey(taskCode));
  1015. }
  1016. }
  1017. else
  1018. {
  1019. invalidCourseTaskInsert.Add(courseTaskInsert);
  1020. }
  1021. }
  1022. return Ok(new { invalidCourseTaskInsert, courseTasks });
  1023. }
  1024. else
  1025. {
  1026. //获取相关的名单
  1027. List<GroupListDto> groupListDtos = await GroupListService.GetGroupListByListids(client, _dingDing, datas.Select(z => z.groupId).ToHashSet().ToList(), school);
  1028. //获取相关的教室
  1029. var roomIds = datas.Where(x => !string.IsNullOrWhiteSpace(x.roomId)).Select(c => $"'{c.roomId}'");
  1030. List<Room> rooms = new List<Room>();
  1031. if (roomIds.Any() && !string.IsNullOrWhiteSpace(school))
  1032. {
  1033. string sqlRoom = $"select value c from c where c.id in ({string.Join(",", roomIds)})";
  1034. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Room>(sqlRoom, $"Room-{school}");
  1035. if (result.list.IsNotEmpty())
  1036. {
  1037. rooms.AddRange(result.list);
  1038. }
  1039. }
  1040. //获取教师
  1041. List<Teacher> teachers = new List<Teacher>();
  1042. var teacherIds = datas.Where(x => !string.IsNullOrWhiteSpace(x.teacherId)).Select(c => $"'{c.teacherId}'");
  1043. if (teacherIds.Any())
  1044. {
  1045. string sqlTeacher = $"select value c from c where c.id in ({string.Join(",", teacherIds)}) ";
  1046. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<Teacher>(sqlTeacher, $"Base");
  1047. if (result.list.IsNotEmpty())
  1048. {
  1049. teachers.AddRange(result.list);
  1050. }
  1051. }
  1052. //获取课程
  1053. List<CourseBase> courseBases = new List<CourseBase>();
  1054. var courseIds = datas.Where(x => !string.IsNullOrWhiteSpace(x.courseId)).Select(c => $"'{c.courseId}'");
  1055. if (courseIds.Any())
  1056. {
  1057. string sqlCourse = $"select value c from c where c.id in ({string.Join(",", courseIds)}) and c.creatorId='{tmdid}' ";
  1058. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<CourseBase>(sqlCourse, $"CourseBase");
  1059. if (result.list.IsNotEmpty())
  1060. {
  1061. courseBases.AddRange(result.list);
  1062. }
  1063. }
  1064. HashSet<CourseTask> courseTasks = new HashSet<CourseTask>();
  1065. List<CourseTaskChanged> invalidCourseTaskInsert = new List<CourseTaskChanged>();
  1066. foreach (var data in datas)
  1067. {
  1068. var courseTaskInsert = SchoolService.CheckCourseTaskInsertOrChanged($"{grant_type}", scope.ToString(), data, null, null, courseBases, groupListDtos, rooms, null, teachers);
  1069. if (courseTaskInsert.invalidCode == 0)
  1070. {
  1071. string taskCode = $"CourseTask";
  1072. string taskId = courseTaskInsert.courseId;
  1073. CourseTask courseTask = courseTasks.Where(z => z.id.Equals(taskId) && z.code.Equals(taskCode)).FirstOrDefault();
  1074. if (courseTask == null)
  1075. {
  1076. ResponseMessage response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync(taskId, new PartitionKey(taskCode));
  1077. if (response.StatusCode==System.Net.HttpStatusCode.OK)
  1078. {
  1079. courseTask = JsonDocument.Parse(response.Content).RootElement.ToObject<CourseTask>();
  1080. }
  1081. else
  1082. {
  1083. courseTask = new CourseTask
  1084. {
  1085. id = taskId,
  1086. code = taskCode,
  1087. pk = "CourseTask",
  1088. ttl = -1,
  1089. courseId = courseTaskInsert.courseId,
  1090. schedules = new List<ScheduleTask> { new ScheduleTask {
  1091. roomId = courseTaskInsert.roomId,
  1092. groupId = courseTaskInsert.groupId,
  1093. type = courseTaskInsert.type,
  1094. teacherId = courseTaskInsert.teacherId,
  1095. notice=courseTaskInsert.notice,
  1096. startTime = courseTaskInsert.startTime,
  1097. times= new List<ScheduleTime>(),
  1098. school=courseTaskInsert.school,
  1099. } }
  1100. };
  1101. }
  1102. }
  1103. ScheduleTask scheduleTask = null;
  1104. var scheduleTasks = courseTask.schedules.FindAll(z => z.type.Equals(courseTaskInsert.type) && z.groupId.Equals(courseTaskInsert.groupId));
  1105. if (scheduleTasks.IsNotEmpty())
  1106. {
  1107. if (scheduleTasks.Count > 2)
  1108. {
  1109. courseTask.schedules.RemoveRange(1, scheduleTasks.Count - 1);
  1110. }
  1111. scheduleTask = scheduleTasks.First();
  1112. scheduleTask.roomId = string.IsNullOrWhiteSpace(courseTaskInsert.roomId) ? scheduleTask.roomId : courseTaskInsert.roomId;
  1113. scheduleTask.school = school;
  1114. scheduleTask.teacherId = courseTaskInsert.teacherId;
  1115. scheduleTask.startTime = courseTaskInsert.startTime > 0 ? courseTaskInsert.startTime : scheduleTask.startTime;
  1116. scheduleTask.notice = string.IsNullOrWhiteSpace(courseTaskInsert.notice) ? scheduleTask.notice : courseTaskInsert.notice;
  1117. scheduleTask.assistants = courseTaskInsert.assistants != null ? courseTaskInsert.assistants : courseTaskInsert.assistants;
  1118. }
  1119. else
  1120. {
  1121. scheduleTask = new ScheduleTask()
  1122. {
  1123. roomId = courseTaskInsert.roomId,
  1124. groupId = courseTaskInsert.groupId,
  1125. type = courseTaskInsert.type,
  1126. teacherId = courseTaskInsert.teacherId,
  1127. times = new List<ScheduleTime>(),
  1128. school = school,
  1129. notice = courseTaskInsert.notice,
  1130. };
  1131. courseTask.schedules.Add(scheduleTask);
  1132. }
  1133. //修改教师或名单
  1134. if (grant_type.ToString().Equals("change-scheduleTask", StringComparison.OrdinalIgnoreCase))
  1135. {
  1136. if (!string.IsNullOrWhiteSpace(courseTaskInsert.teacherIdChanged))
  1137. {
  1138. scheduleTask.teacherId = courseTaskInsert.teacherIdChanged;
  1139. }
  1140. if (!string.IsNullOrWhiteSpace(courseTaskInsert.typeChanged) && !string.IsNullOrWhiteSpace(courseTaskInsert.groupIdChanged))
  1141. {
  1142. scheduleTask.groupId = courseTaskInsert.groupIdChanged;
  1143. scheduleTask.type = courseTaskInsert.typeChanged;
  1144. }
  1145. }
  1146. //await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(courseTask, new PartitionKey(taskCode));
  1147. //删除教师及名单的排课信息
  1148. if (grant_type.ToString().Equals("delete-scheduleTask", StringComparison.OrdinalIgnoreCase))
  1149. {
  1150. courseTask.schedules.Remove(scheduleTask);
  1151. }
  1152. //如果被删除完了,就删除该条记录。
  1153. if (courseTask.schedules.Count <= 0)
  1154. {
  1155. courseTasks.Remove(courseTask);
  1156. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).DeleteItemStreamAsync(courseTask.id, new PartitionKey(courseTask.code));
  1157. }
  1158. else
  1159. {
  1160. courseTasks.Add(courseTask);
  1161. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(courseTask, new PartitionKey(taskCode));
  1162. }
  1163. }
  1164. else
  1165. {
  1166. invalidCourseTaskInsert.Add(courseTaskInsert);
  1167. }
  1168. }
  1169. return Ok(new { invalidCourseTaskInsert, courseTasks });
  1170. }
  1171. }
  1172. //按照模板导入进行数据转换并且进行检查
  1173. case bool when $"{grant_type}".Equals("import-check") && $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase):
  1174. {
  1175. //检查完成,生成一个检查通过的token+检查结果(pass,warn,error), 在正式导入的时候,只需要检查token是否存在则进行数据保存。 以确保每次被导入的数据都是检查通过的。
  1176. //并标记相关检查状态对于的具体数值。
  1177. //数据转换是必须的,可选是否开启数据检查,数据检查包括导入数据自检(逻辑,排他,教室-名单-教师-时间段,重复),导入数据与数据库数据库的比对检查。
  1178. //课程 批量升学年 学期.
  1179. if (!request.TryGetProperty("courseCheckImports", out JsonElement _courseCheckImports)) return BadRequest();
  1180. if (!request.TryGetProperty("periodId", out JsonElement _periodId)) return BadRequest();
  1181. if (!request.TryGetProperty("semesterId", out JsonElement _semesterId)) return BadRequest();
  1182. if (!request.TryGetProperty("studyYear", out JsonElement _studyYear) ) return BadRequest();
  1183. if (!int.TryParse($"{_studyYear}", out int studyYear)) { return BadRequest(); }
  1184. request.TryGetProperty("majorId", out JsonElement _majorId);
  1185. School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  1186. var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
  1187. if (period == null)
  1188. {
  1189. return Ok(new { code = 1, msg = "学段不存在!" });
  1190. }
  1191. List<CourseCheckImport> courseCheckImports = _courseCheckImports.ToObject<List<CourseCheckImport>>();
  1192. courseCheckImports.ForEach(z => { z.type = z.type.ToLower(); });
  1193. var courseNoIsNulls = courseCheckImports.Where(x => string.IsNullOrWhiteSpace(x.courseNo));
  1194. if (courseNoIsNulls!=null && courseNoIsNulls.Count()>0) {
  1195. // return Ok();
  1196. foreach (var courseNoIsNull in courseNoIsNulls) {
  1197. courseNoIsNull.invalidCode=1;
  1198. }
  1199. return Ok(new { courseCheckedImports = new HashSet<CourseTask>(), checkedCount=0, invalidCount = courseNoIsNulls.Count(), courseVerifiedImports= new List<CourseCheckImport> (), courseInvalidImports= courseNoIsNulls, checkToken = string.Empty });
  1200. }
  1201. //数据检查
  1202. //1.检查导入的课程编号是否有效
  1203. StringBuilder sqlNo = new StringBuilder(" select value c from c ");
  1204. var courseNoidImports = courseCheckImports.Where(x => string.IsNullOrWhiteSpace(x.courseNo));
  1205. sqlNo.Append($" where c.no in({string.Join(",", courseCheckImports.Where(x => !string.IsNullOrWhiteSpace(x.courseNo)).Select(z => $"'{z.courseNo}'"))}) and c.period.id='{_periodId}' ");
  1206. if (!string.IsNullOrWhiteSpace($"{_majorId}"))
  1207. {
  1208. var major = period.majors.Find(z => z.id.Equals($"{_majorId}"));
  1209. if (major==null)
  1210. {
  1211. return Ok(new { code = 2, msg = "专业不存在!" });
  1212. }
  1213. sqlNo.Append($" and c.major.id='{_majorId}'");
  1214. }
  1215. List<CourseBase> courseBases = new List<CourseBase>();
  1216. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
  1217. .GetItemQueryIteratorSql<CourseBase>(queryText: sqlNo.ToString(), requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"CourseBase-{school}") }))
  1218. {
  1219. courseBases.Add(item);
  1220. }
  1221. HashSet<CourseCheckImport> courseInvalidImports = new HashSet<CourseCheckImport>();
  1222. HashSet<CourseCheckImport> courseVerifiedImports = new HashSet<CourseCheckImport>();
  1223. var noInvalidImports = courseCheckImports.Where(z => !courseBases.Select(x => x.no).Contains(z.courseNo));
  1224. //保留课程名称存在的排课信息
  1225. if (noInvalidImports != null && noInvalidImports.Any())
  1226. {
  1227. foreach (var noInvalidImport in noInvalidImports)
  1228. {
  1229. noInvalidImport.invalidCode =1;
  1230. courseInvalidImports.Add(noInvalidImport);
  1231. }
  1232. courseCheckImports.RemoveAll(z => noInvalidImports.Contains(z));
  1233. }
  1234. //2.检查导入的醍摩豆教师ID是否有效
  1235. StringBuilder sqlTmdid = new StringBuilder(" select c.id,c.name ,c.code ,c.picture from c ");
  1236. //sqlTmdid.Append($" where c.id in({string.Join(",", courseCheckImports.Select(z => $"'{z.tmdid}'"))}) ");
  1237. List<IdNameCode> teachers = new List<IdNameCode>();
  1238. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
  1239. .GetItemQueryIteratorSql<IdNameCode>(queryText: sqlTmdid.ToString(), requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Teacher-{school}") }))
  1240. {
  1241. teachers.Add(item);
  1242. }
  1243. var tmdidInvalidImports = courseCheckImports.ExceptBy(teachers.Select(x => x.id), z => z.tmdid);
  1244. //保留课程名称存在的及醍摩豆ID有效的排课信息
  1245. if (tmdidInvalidImports != null && tmdidInvalidImports.Any())
  1246. {
  1247. foreach (var tmdidInvalidImport in tmdidInvalidImports)
  1248. {
  1249. tmdidInvalidImport.invalidCode = 2;
  1250. courseInvalidImports.Add(tmdidInvalidImport);
  1251. }
  1252. courseCheckImports.RemoveAll(z => tmdidInvalidImports.Contains(z));
  1253. }
  1254. //3.检查导入的教学班名称是否有效
  1255. IEnumerable<CourseCheckImport> teachInvalidImports = null;
  1256. List<GroupList> groupLists = new List<GroupList>();
  1257. var teachList = courseCheckImports.Where(x => x.type.Equals("teach"));
  1258. if (teachList.Any() && teachList.Count()>0)
  1259. {
  1260. StringBuilder sqlTeach = new StringBuilder(" select value c from c ");
  1261. sqlTeach.Append($" where c.name in({string.Join(",", teachList.Select(z => $"'{z.list}'"))}) ");
  1262. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
  1263. .GetItemQueryIteratorSql<GroupList>(queryText: sqlTeach.ToString(), requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"GroupList-{school}") }))
  1264. {
  1265. groupLists.Add(item);
  1266. }
  1267. teachInvalidImports = teachList.ExceptBy(groupLists.Select(x => x.name), z => z.list);
  1268. //保留课程名称存在的及醍摩豆ID有效的排课信息
  1269. if (teachInvalidImports != null && teachInvalidImports.Any())
  1270. {
  1271. foreach (var teachInvalidImport in teachInvalidImports)
  1272. {
  1273. teachInvalidImport.invalidCode = 3;
  1274. courseInvalidImports.Add(teachInvalidImport);
  1275. }
  1276. courseCheckImports.RemoveAll(z => teachInvalidImports.Contains(z));
  1277. }
  1278. }
  1279. //4.检查导入的教室编号是否有效
  1280. //获取填写了教室编号的数据
  1281. var roomNos = courseCheckImports.Where(z => !string.IsNullOrWhiteSpace(z.roomNo));
  1282. IEnumerable<CourseCheckImport> roomNoInvalidImports = null;
  1283. List<Room> rooms = new List<Room>();
  1284. if (roomNos.Any() && roomNos.Count() > 0)
  1285. {
  1286. StringBuilder sqlRoom = new StringBuilder(" select value c from c ");
  1287. sqlRoom.Append($" where c.no in({string.Join(",", roomNos.Select(z => $"'{z.roomNo}'"))}) ");
  1288. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
  1289. .GetItemQueryIteratorSql<Room>(queryText: sqlRoom.ToString(), requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Room-{school}") }))
  1290. {
  1291. rooms.Add(item);
  1292. }
  1293. roomNoInvalidImports = courseCheckImports.ExceptBy(rooms.Select(x => x.no), z => z.roomNo);
  1294. //保留课程名称存在的及醍摩豆ID有效的排课信息
  1295. if (roomNoInvalidImports != null && roomNoInvalidImports.Any())
  1296. {
  1297. foreach (var roomNoInvalidImport in roomNoInvalidImports)
  1298. {
  1299. roomNoInvalidImport.invalidCode = 4;
  1300. courseInvalidImports.Add(roomNoInvalidImport);
  1301. }
  1302. courseCheckImports.RemoveAll(z => roomNoInvalidImports.Contains(z));
  1303. }
  1304. }
  1305. //5.检查开学日期,行政班编号是否有效
  1306. //List<CourseCheckImport> stimeInvalidImports = new List<CourseCheckImport>() ;
  1307. //List<CourseCheckImport> etimeInvalidImports = new List<CourseCheckImport>();
  1308. //List<CourseCheckImport> scheduleInvalidImports = new List<CourseCheckImport>();
  1309. //List<CourseCheckImport> classIdNoInvalidImports = new List<CourseCheckImport>();
  1310. Dictionary<string, List<Class>> duplicateClasses = new Dictionary<string, List<Class>>();
  1311. //1 上课时间段的
  1312. var timeTables = period.timetable.Where(z => z.type.Equals("1")).ToList();
  1313. HashSet<CourseTask> courseTasks = new HashSet<CourseTask>();
  1314. int checkedCount = 0;
  1315. foreach (var item in courseCheckImports)
  1316. {
  1317. //DateTimeOffset sdateTime = default;
  1318. //DateTimeOffset edateTime = default;
  1319. //5.1.检查开学日期格式是否正确
  1320. //if (!DateTimeOffset.TryParseExact(item.stime, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out sdateTime))
  1321. //{
  1322. // item.invalidCode = 5;
  1323. // courseInvalidImports.Add(item);
  1324. // continue;
  1325. //}
  1326. //获取当前学年,当前学期,当前导入时间的日期,以及下学期开学时间
  1327. // (Semester currSemester, int studyYear, DateTimeOffset date, DateTimeOffset nextSemester) info = SchoolService.GetSemester(period, time: item.stime);
  1328. var currSemester= period.semesters.Find(v => v.id.Equals($"{_semesterId}"));
  1329. if (currSemester != null)
  1330. {
  1331. //5.2检查课程结束日期格式是否正确
  1332. //if (!string.IsNullOrWhiteSpace(item.etime))
  1333. //{
  1334. // if (!DateTimeOffset.TryParseExact(item.etime, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out edateTime))
  1335. // {
  1336. // item.invalidCode = 6;
  1337. // courseInvalidImports.Add(item);
  1338. // continue;
  1339. // }
  1340. //}
  1341. // else
  1342. //{
  1343. //未设置课程结束时间,开学前一天
  1344. // edateTime = info.nextSemester.AddDays(-1);
  1345. //}
  1346. }
  1347. else
  1348. {
  1349. //15.根据开学时间无法获取学期信息
  1350. item.invalidCode = 15;
  1351. courseInvalidImports.Add(item);
  1352. continue;
  1353. }
  1354. ScheduleTime scheduleTime = null;
  1355. //5.3检查排课字段格式,数据是否符合要求
  1356. if (!string.IsNullOrWhiteSpace(item.schedule))
  1357. {
  1358. string[] datas = item.schedule.Split('-');
  1359. if (datas.Length >= 3)
  1360. {
  1361. int timeIndex = -1;
  1362. int weekIndex = -1;
  1363. string mode = string.Empty;
  1364. if (int.TryParse(datas[0], out timeIndex) && timeIndex > 0
  1365. && int.TryParse(datas[1], out weekIndex) && weekIndex > 0
  1366. && (datas[2].Equals("A", StringComparison.OrdinalIgnoreCase) || datas[2].Equals("D", StringComparison.OrdinalIgnoreCase) || datas[2].Equals("C", StringComparison.OrdinalIgnoreCase)))
  1367. {
  1368. mode = datas[2];
  1369. HashSet<int> weekIndexs = new HashSet<int>();
  1370. if (mode.Equals("C"))
  1371. {
  1372. if (datas.Length == 4)
  1373. {
  1374. var customWeeks = datas[3].Split(',');
  1375. bool hasInvalidData = false;
  1376. HashSet<int> weeks = new HashSet<int>();
  1377. foreach (var customWeek in customWeeks)
  1378. {
  1379. if (int.TryParse(customWeek, out int customWeekIndex) && customWeekIndex > 0)
  1380. {
  1381. weeks.Add(customWeekIndex);
  1382. }
  1383. else
  1384. {
  1385. hasInvalidData = true;
  1386. break;
  1387. }
  1388. }
  1389. if (hasInvalidData)
  1390. {
  1391. //C 自定义模式下,配置的上课周是大于等于1的整数
  1392. item.invalidCode = 11;
  1393. courseInvalidImports.Add(item);
  1394. continue;
  1395. }
  1396. else
  1397. {
  1398. weekIndexs = weeks;
  1399. }
  1400. }
  1401. else
  1402. {
  1403. //C 自定义模式下,需要配置对应的上课周
  1404. item.invalidCode = 10;
  1405. courseInvalidImports.Add(item);
  1406. continue;
  1407. }
  1408. }
  1409. scheduleTime = new ScheduleTime();
  1410. try
  1411. {
  1412. var timeTable = timeTables[timeIndex-1];
  1413. scheduleTime.id= timeTable.id;
  1414. }
  1415. catch (Exception ex)
  1416. {
  1417. //数组越界,表示导入的不存在,没有对应的上课时间段
  1418. item.invalidCode = 8;
  1419. courseInvalidImports.Add(item);
  1420. continue;
  1421. }
  1422. try
  1423. {
  1424. var week = weekDays[weekIndex - 1];
  1425. scheduleTime.week = week;
  1426. }
  1427. catch (Exception ex)
  1428. {
  1429. //数组越界,表示导入的不存在
  1430. //上课时间不在星期一至星期日
  1431. item.invalidCode = 9;
  1432. courseInvalidImports.Add(item);
  1433. continue;
  1434. }
  1435. scheduleTime.mode= mode;
  1436. scheduleTime.index = weekIndexs;
  1437. }
  1438. else
  1439. {
  1440. //不满足最基本的1-1-A格式,可能是不是数字,或者不是A,D,C模式,
  1441. //排课时间格式不满足[1-n]-[1|2|3|4|5|6|7]-[A|D|C]
  1442. item.invalidCode = 7;
  1443. courseInvalidImports.Add(item);
  1444. continue;
  1445. }
  1446. }
  1447. else
  1448. {
  1449. //不满足最基本的1-1-A格式
  1450. //排课时间格式不满足[1-n]-[1|2|3|4|5|6|7]-[A|D|C]
  1451. item.invalidCode = 7;
  1452. courseInvalidImports.Add(item);
  1453. continue;
  1454. }
  1455. }
  1456. string groupId = string.Empty;
  1457. //5.4 检查导入的行政班编号是否有效
  1458. if (item.type.Equals("class"))
  1459. {
  1460. var yearNo = item.list.Split("-");
  1461. if (yearNo.Length == 2)
  1462. {
  1463. StringBuilder sqlYearNo = new StringBuilder(" select value c from c ");
  1464. sqlYearNo.Append($" where c.year ={yearNo[0]} and c.no ='{yearNo[1]}' and c.periodId='{period.id}' ");
  1465. List<Class> classes = new List<Class>();
  1466. await foreach (var classInfo in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
  1467. .GetItemQueryIteratorSql<Class>(queryText: sqlYearNo.ToString(), requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Class-{school}") }))
  1468. {
  1469. classes.Add(classInfo);
  1470. }
  1471. if (classes.Count > 1)
  1472. {
  1473. ///班级入学年-编号重复的班级
  1474. if (duplicateClasses.ContainsKey(item.list))
  1475. {
  1476. duplicateClasses[item.list].AddRange(classes);
  1477. }
  1478. else {
  1479. duplicateClasses.TryAdd(item.list, classes);
  1480. }
  1481. //导入的班级入学年-编号在系统中重复,请检查行政班设置。
  1482. item.invalidCode = 13;
  1483. courseInvalidImports.Add(item);
  1484. continue;
  1485. }
  1486. else if (classes.Count <= 0)
  1487. {
  1488. //班级入学年-编号不存在
  1489. item.invalidCode = 12;
  1490. courseInvalidImports.Add(item);
  1491. continue;
  1492. }
  1493. else
  1494. {
  1495. Class @class = classes[0];
  1496. groupId = @class.id;
  1497. }
  1498. }
  1499. else
  1500. {
  1501. courseInvalidImports.Add(item);
  1502. //导入的班级入学年-编号格式错误
  1503. item.invalidCode = 14;
  1504. continue;
  1505. }
  1506. }
  1507. else
  1508. {
  1509. var groupList = groupLists.Find(z => z.name.Equals(item.list));
  1510. groupId=groupList?.id;
  1511. }
  1512. //检查助教是否存在
  1513. string[] assistants = new string[] { };
  1514. if (!string.IsNullOrWhiteSpace(item.assistants))
  1515. {
  1516. assistants = Regex.Split(item.assistants, "\\.|\\.|\\、|\\:|\\:|\\,|\\,|\\;|\\;");
  1517. if (assistants.Length>10) {
  1518. item.invalidCode = 22;
  1519. courseInvalidImports.Add(item);
  1520. continue;
  1521. }
  1522. var invalidAssistants = assistants.Except(teachers.Select(x => x.id));
  1523. if (invalidAssistants != null && invalidAssistants.Any())
  1524. {
  1525. item.invalidCode = 21;
  1526. item.invalidMsg = $"{string.Join(",", invalidAssistants)}";
  1527. courseInvalidImports.Add(item);
  1528. continue;
  1529. }
  1530. }
  1531. Room room = rooms.Find(z => !string.IsNullOrWhiteSpace(item.roomNo) && z.no.Equals(item.roomNo));
  1532. string roomId = room?.id;
  1533. string teacherId = teachers.Find(z => z.id.Equals(item.tmdid))?.id;
  1534. CourseBase courseBase = courseBases.Find(z => z.no.Equals(item.courseNo));
  1535. string taskId = $"{studyYear}-{currSemester.id}-{courseBase.id}";
  1536. string taskCode = $"CourseTask-{school}";
  1537. CourseTask courseTask = courseTasks.FirstOrDefault(z => z.id.Equals(taskId) && z.code.Equals(taskCode));
  1538. if (courseTask == null)
  1539. {
  1540. ResponseMessage courseTaskResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(taskId, new PartitionKey(taskCode));
  1541. if (courseTaskResponse.StatusCode==System.Net.HttpStatusCode.OK)
  1542. {
  1543. courseTask = JsonDocument.Parse(courseTaskResponse.Content).RootElement.ToObject<CourseTask>();
  1544. }
  1545. }
  1546. if (courseTask == null)
  1547. {
  1548. courseTask = new CourseTask()
  1549. {
  1550. id = taskId,
  1551. code = taskCode,
  1552. //expire = edateTime.ToUnixTimeMilliseconds(),
  1553. pk = "CourseTask",
  1554. ttl = -1,
  1555. courseId = courseBase.id,
  1556. year = studyYear,
  1557. semesterId = currSemester.id,
  1558. schedules = new List<ScheduleTask>
  1559. {
  1560. new ScheduleTask()
  1561. {
  1562. roomId=roomId,
  1563. groupId=groupId,
  1564. type=item.type,
  1565. teacherId=teacherId,
  1566. times = scheduleTime!=null ? new List<ScheduleTime> { scheduleTime }: new List<ScheduleTime> { },
  1567. school=school,
  1568. assistants=assistants.ToHashSet(),
  1569. }
  1570. }
  1571. };
  1572. courseTasks.Add(courseTask);
  1573. }
  1574. else
  1575. {
  1576. ScheduleTask scheduleTask = null;
  1577. var scheduleTasks = courseTask.schedules.FindAll(z => z.type.Equals(item.type) && z.groupId.Equals(groupId));
  1578. if (scheduleTasks.IsNotEmpty())
  1579. {
  1580. if (scheduleTasks.Count > 2)
  1581. {
  1582. courseTask.schedules.RemoveRange(1, scheduleTasks.Count - 1);
  1583. }
  1584. scheduleTask = scheduleTasks.First();
  1585. scheduleTask.roomId = string.IsNullOrWhiteSpace(roomId) ? scheduleTask.roomId : roomId;
  1586. scheduleTask.school = school;
  1587. scheduleTask.teacherId = teacherId;
  1588. scheduleTask.assistants = assistants != null ? assistants.ToHashSet() : scheduleTask.assistants;
  1589. if (scheduleTime != null)
  1590. {
  1591. var shtime = scheduleTask.times.Find(z => z.id.Equals(scheduleTime.id) && z.week.Equals(scheduleTime.week) && z.mode.Equals(scheduleTime.mode));
  1592. if (shtime == null)
  1593. {
  1594. scheduleTask.times.Add(scheduleTime);
  1595. }
  1596. else
  1597. {
  1598. if (scheduleTime.index.Any())
  1599. {
  1600. foreach (var ind in scheduleTime.index)
  1601. {
  1602. shtime.index.Add(ind);
  1603. }
  1604. }
  1605. }
  1606. }
  1607. }
  1608. else
  1609. {
  1610. scheduleTask = new ScheduleTask()
  1611. {
  1612. roomId = roomId,
  1613. groupId = groupId,
  1614. type = item.type,
  1615. teacherId = teacherId,
  1616. times = scheduleTime != null ? new List<ScheduleTime> { scheduleTime } : new List<ScheduleTime> { },
  1617. school = school,
  1618. assistants= assistants != null ? assistants.ToHashSet() : scheduleTask.assistants
  1619. };
  1620. courseTask.schedules.Add(scheduleTask);
  1621. }
  1622. courseTasks.Add(courseTask);
  1623. }
  1624. item.invalidCode = 0;
  1625. courseVerifiedImports.Add(item);
  1626. checkedCount++;
  1627. }
  1628. //生成检查结果token,有效期5分钟
  1629. if (courseTasks != null && courseTasks.Count > 0)
  1630. {
  1631. string checkToken = $"CourseTask:CheckToken:{scope}:{school}:{Guid.NewGuid()}";
  1632. await _azureRedis.GetRedisClient(8).StringSetAsync(checkToken, courseTasks.ToJsonString(), expiry: new TimeSpan(0, 5, 0));
  1633. return Ok(new { courseCheckedImports = courseTasks, checkedCount, invalidCount = courseInvalidImports.Count, courseVerifiedImports, courseInvalidImports, checkToken });
  1634. }
  1635. else
  1636. {
  1637. return Ok(new { courseCheckedImports = courseTasks, checkedCount, invalidCount = courseInvalidImports.Count, courseVerifiedImports, courseInvalidImports, checkToken = string.Empty });
  1638. }
  1639. }
  1640. case bool when $"{grant_type}".Equals("import-task", StringComparison.OrdinalIgnoreCase) && $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase):
  1641. {
  1642. request.TryGetProperty("checkToken", out JsonElement _checkToken);
  1643. if (!string.IsNullOrWhiteSpace($"{_checkToken}") && $"{_checkToken}".StartsWith($"CourseTask:CheckToken:{scope}:{school}:"))
  1644. {
  1645. RedisValue value = await _azureRedis.GetRedisClient(8).StringGetAsync($"{_checkToken}");
  1646. List<CourseTask> courseTasks = value.ToString().ToObject<List<CourseTask>>();
  1647. if (courseTasks.IsNotEmpty())
  1648. {
  1649. foreach (var task in courseTasks)
  1650. {
  1651. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(task, new PartitionKey(task.code));
  1652. }
  1653. return Ok(new { code = 200 });
  1654. }
  1655. }
  1656. return BadRequest();
  1657. }
  1658. case bool when $"{grant_type}".Equals("export-task", StringComparison.OrdinalIgnoreCase) && $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase):
  1659. {
  1660. JsonElement _year = default, _semesterId = default, _periodId = default;
  1661. if (!request.TryGetProperty("periodId", out _periodId)) return BadRequest();
  1662. if (!request.TryGetProperty("year", out _year))
  1663. {
  1664. return BadRequest();
  1665. }
  1666. if (!request.TryGetProperty("semesterId", out _semesterId))
  1667. {
  1668. return BadRequest();
  1669. }
  1670. School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  1671. var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
  1672. string date = SchoolService.GetOpensByStudyYearAndSemester(period.semesters, int.Parse($"{_year}"), $"{_semesterId}");
  1673. string sql = $"select value c from c where c.year={_year} and c.semesterId='{_semesterId}'";
  1674. string code = $"CourseTask-{school}";
  1675. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseTask>(sql, code);
  1676. List<CourseCheckImport> imports = new List<CourseCheckImport>();
  1677. if (result.list.IsNotEmpty())
  1678. {
  1679. string courseIdSQL = $"select value c from c where c.id in({string.Join(",", result.list.Select(z => $"'{z.courseId}'"))})";
  1680. List<CourseBase> courseBases = new List<CourseBase>();
  1681. var resultCourse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseBase>(courseIdSQL, $"CourseBase-{school}");
  1682. if (resultCourse.list.IsNotEmpty())
  1683. {
  1684. courseBases.AddRange(resultCourse.list);
  1685. }
  1686. var classIds = result.list.SelectMany(z => z.schedules).Where(y => y.type.Equals("class") && !string.IsNullOrWhiteSpace(y.groupId)).Select(x => x.groupId);
  1687. var teachIds = result.list.SelectMany(z => z.schedules).Where(y => y.type.Equals("teach")&& !string.IsNullOrWhiteSpace(y.groupId)).Select(x => x.groupId);
  1688. var teacherIds = result.list.SelectMany(z => z.schedules).Where(y => !string.IsNullOrWhiteSpace(y.teacherId)).Select(x => x.teacherId);
  1689. var assistantIds = result.list.SelectMany(z => z.schedules).Where(y => y.assistants!=null && y.assistants.Any()).SelectMany(x => x.assistants);
  1690. List<Class> classes = new List<Class>();
  1691. if (classIds!=null && classIds.Count()>0)
  1692. {
  1693. string classIdSQL = $"select value c from c where c.id in({string.Join(",", classIds.Select(x => $"'{x}'"))})";
  1694. var resultClass = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Class>(classIdSQL, $"Class-{school}");
  1695. if (resultClass.list.IsNotEmpty())
  1696. {
  1697. classes.AddRange(resultClass.list);
  1698. }
  1699. }
  1700. List<GroupList> groupLists = new List<GroupList>();
  1701. if (teachIds!=null && teachIds.Count()>0)
  1702. {
  1703. string teachIdSQL = $"select value c from c where c.id in({string.Join(",", teachIds.Select(x => $"'{x}'"))})";
  1704. var resultGroupList = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<GroupList>(teachIdSQL, $"GroupList-{school}");
  1705. if (resultGroupList.list.IsNotEmpty())
  1706. {
  1707. groupLists.AddRange(resultGroupList.list);
  1708. }
  1709. }
  1710. List<string> tmdids = new List<string>();
  1711. if (teacherIds!=null && teacherIds.Count()>0)
  1712. {
  1713. tmdids.AddRange(teacherIds);
  1714. }
  1715. if (assistantIds!=null && assistantIds.Count()>0)
  1716. {
  1717. tmdids.AddRange(assistantIds);
  1718. }
  1719. List<Teacher> teachers = new List<Teacher>();
  1720. if (tmdids.Count>0)
  1721. {
  1722. string tmdidSQL = $"select value c from c where c.id in({string.Join(",", tmdids.Select(x => $"'{x}'"))})";
  1723. var resultTmdid = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<Teacher>(tmdidSQL, "Base");
  1724. if (resultTmdid.list.IsNotEmpty())
  1725. {
  1726. teachers.AddRange(resultTmdid.list);
  1727. }
  1728. }
  1729. foreach (var item in result.list)
  1730. {
  1731. var courseBase = courseBases.Find(z =>!string.IsNullOrWhiteSpace(item.courseId) && z.id.Equals(item.courseId));
  1732. if (courseBase != null) {
  1733. foreach (var z in item.schedules)
  1734. {
  1735. //CourseCheckImport courseCheckImport = new CourseCheckImport { name=courseBase?.name, stime=date, grade=courseBase.grade, courseNo=courseBase.no };
  1736. CourseCheckImport courseCheckImport = new CourseCheckImport { name=courseBase?.name, grade=courseBase.grade, courseNo=courseBase.no };
  1737. if (string.IsNullOrWhiteSpace(z.type)||string.IsNullOrWhiteSpace(z.groupId))
  1738. {
  1739. continue;
  1740. }
  1741. if (z.type.Equals("class") &&!string.IsNullOrWhiteSpace(z.groupId))
  1742. {
  1743. var clazz = classes.Find(x => x.id.Equals(z.groupId));
  1744. if (clazz!=null)
  1745. {
  1746. courseCheckImport.type=z.type;
  1747. courseCheckImport.list=$"{clazz?.year}-{clazz?.no}";
  1748. courseCheckImport.listName=clazz?.name;
  1749. }
  1750. else
  1751. {
  1752. continue;
  1753. }
  1754. }
  1755. if (z.type.Equals("teach")&&!string.IsNullOrWhiteSpace(z.groupId))
  1756. {
  1757. var groupList = groupLists.Find(x => x.id.Equals(z.groupId));
  1758. if (groupList!=null)
  1759. {
  1760. courseCheckImport.type=z.type;
  1761. courseCheckImport.list=$"{groupList?.name}";
  1762. courseCheckImport.listName=groupList?.name;
  1763. }
  1764. else { continue; }
  1765. }
  1766. if (!string.IsNullOrWhiteSpace(z.teacherId))
  1767. {
  1768. var teacher = teachers.Find(x => x.id.Equals(z.teacherId));
  1769. if (teacher!=null)
  1770. {
  1771. courseCheckImport.tmdid=teacher?.id;
  1772. courseCheckImport.tmdName=teacher?.name;
  1773. }
  1774. else { continue; }
  1775. }
  1776. else { continue; }
  1777. if (z.assistants!=null && z.assistants.Count>0)
  1778. {
  1779. var teacher_assistants = teachers.FindAll(x => z.assistants.Contains(x.id));
  1780. if (teacher_assistants!=null)
  1781. {
  1782. courseCheckImport.assistants=string.Join(",", z.assistants);
  1783. courseCheckImport.assistantNames=string.Join(",", teacher_assistants.Select(x => x.name));
  1784. }
  1785. }
  1786. imports.Add(courseCheckImport);
  1787. };
  1788. }
  1789. }
  1790. }
  1791. return Ok(new { export = imports, code = 200 });
  1792. }
  1793. }
  1794. }
  1795. catch (Exception ex)
  1796. {
  1797. await _dingDing.SendBotMsg($"{_option.Location},课程处理异常,{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
  1798. return Ok(new { code = 500, msg = ex.Message });
  1799. }
  1800. return Ok();
  1801. }
  1802. //http://localhost:5000/course-base/student
  1803. /*
  1804. *x-auth-authtoken: eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0ZXN0LnRlYW1tb2RlbC5jbiIsInN1YiI6IjIwMjAwMTAwMSIsImF6cCI6ImhiY24iLCJleHAiOjE2OTE2MzcxOTgsIm5hbWUiOiLljaLkuInor5ciLCJwaWN0dXJlIjoiIiwicm9sZXMiOlsic3R1ZGVudCJdLCJwZXJtaXNzaW9ucyI6bnVsbCwic3RhbmRhcmQiOiIiLCJzY29wZSI6InN0dWRlbnQiLCJhcmVhIjoiNjllM2Q0MTMtNTBhMS00ZjVlLTg0NGEtZTBmN2M5NjIyZWEzIiwid2Vic2l0ZSI6IklFUyJ9.w2ocnKu6RAnvQ6qhH_ZDTO8GSdIVd1ba2Tmd6svv1Ms
  1805. {
  1806. "scope": "school",
  1807. "periodId": "463db08d-cbe7-48a0-a81a-fc39b3c1fep1",
  1808. "grant_type": "attend",
  1809. "year": 2023,
  1810. "semesterId": "08b81e76-e7d2-4001-8b4c-e7c789ef4bs1"
  1811. }
  1812. */
  1813. /// <summary>
  1814. ///学生端课程列表接口
  1815. /// </summary>
  1816. /// <param name="request"></param>
  1817. /// <returns></returns>
  1818. [ProducesDefaultResponseType]
  1819. [AuthToken(Roles = "student")]
  1820. [HttpPost("student")]
  1821. #if !DEBUG
  1822. [Authorize(Roles = "IES")]
  1823. #endif
  1824. public async Task<IActionResult> Student(JsonElement request) {
  1825. try
  1826. {
  1827. (string userid, _, _, string school) = HttpContext.GetAuthTokenInfo();
  1828. if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
  1829. string code = $"CourseTask-{school}";
  1830. var client = _azureCosmos.GetCosmosClient();
  1831. object scope = null;
  1832. HttpContext?.Items.TryGetValue("Scope", out scope);
  1833. int memberType = 2;
  1834. if ($"{scope}".Equals(Constant.ScopeStudent))
  1835. {
  1836. memberType = 2;
  1837. }
  1838. if ($"{scope}".Equals(Constant.ScopeTmdUser))
  1839. {
  1840. memberType = 1;
  1841. }
  1842. if ($"{scope}".Equals(Constant.ScopeTeacher))
  1843. {
  1844. memberType = 1;
  1845. }
  1846. switch (true)
  1847. {
  1848. //学生应参与的课程
  1849. case bool when $"{grant_type}".Equals("attend", StringComparison.OrdinalIgnoreCase):
  1850. List<CourseStudentDto> schoolCourses = new List<CourseStudentDto>();
  1851. List<CourseStudentDto> teahcerCourses = new List<CourseStudentDto>();
  1852. List<IdNameCode> teachers = new List<IdNameCode>();
  1853. List<IdName> rooms = new List<IdName>();
  1854. List<GroupListGrp> groups = await GroupListService.GetMemberInGroupList(_coreAPIHttpService, client, _dingDing, userid, memberType, school, new List<string> { "class", "teach" });
  1855. if (groups.IsNotEmpty())
  1856. {
  1857. List<string> groupIds = groups.Select(x => x.id).ToList();
  1858. HashSet<string> roomIds = new HashSet<string>();
  1859. HashSet<string> teacherIds = new HashSet<string>();
  1860. string sql = $"SELECT distinct value c FROM c join b in c.schedules where c.pk='CourseTask' and b.groupId in({string.Join(",", groups.Select(x => $"'{x.id}'"))}) ";
  1861. List<KeyValuePair<string, CourseTask>> schoolGroupTask = new List<KeyValuePair<string, CourseTask>>();
  1862. List<KeyValuePair<string, CourseTask>> privateGroupTask = new List<KeyValuePair<string, CourseTask>>();
  1863. if (!string.IsNullOrWhiteSpace(school))
  1864. {
  1865. School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  1866. JsonElement _year = default, _semesterId = default, _periodId = default;
  1867. if (!request.TryGetProperty("periodId", out _periodId)) return BadRequest();
  1868. if (!request.TryGetProperty("year", out _year))
  1869. {
  1870. return BadRequest();
  1871. }
  1872. if (!request.TryGetProperty("semesterId", out _semesterId))
  1873. {
  1874. return BadRequest();
  1875. }
  1876. var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
  1877. //string date = SchoolService.GetOpensByStudyYearAndSemester(period.semesters, int.Parse($"{_year}"), $"{_semesterId}");
  1878. sql = $"{sql} and c.year={_year} and c.semesterId='{_semesterId}'";
  1879. HashSet<string> courseIds = new HashSet<string>();
  1880. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseTask>(sql, $"CourseTask-{school}");
  1881. if (resultSchool.list.IsNotEmpty())
  1882. {
  1883. resultSchool.list.ForEach(x =>
  1884. {
  1885. var schedulesGroup = x.schedules.Where(z => !string.IsNullOrWhiteSpace(z.groupId) &&groupIds.Contains(z.groupId));
  1886. if (schedulesGroup.Any())
  1887. {
  1888. courseIds.Add(x.courseId);
  1889. CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
  1890. courseTask.schedules=schedulesGroup.ToList();
  1891. courseTask.schedules.ForEach(z => {
  1892. if (!string.IsNullOrWhiteSpace(z.roomId)) {
  1893. roomIds.Add(z.roomId);
  1894. }
  1895. if (!string.IsNullOrWhiteSpace(z.teacherId))
  1896. {
  1897. teacherIds.Add(z.teacherId);
  1898. }
  1899. if (z.assistants!=null) {
  1900. foreach (var assistant in z.assistants) {
  1901. teacherIds.Add(assistant);
  1902. }
  1903. }
  1904. });
  1905. schoolGroupTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
  1906. }
  1907. });
  1908. }
  1909. if (courseIds.Any())
  1910. {
  1911. string sqlCourse = $"select value c from c where c.id in ({string.Join(",", courseIds.Select(b => $"'{b}'"))})";
  1912. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseBase>(sqlCourse, $"CourseBase-{school}");
  1913. if (result.list.IsNotEmpty())
  1914. {
  1915. foreach (var item in result.list)
  1916. {
  1917. List<CourseTaskDto> courseTaskDtos = new List<CourseTaskDto>();
  1918. var group = schoolGroupTask.Where(x => x.Key.Equals(item.id)).Select(z => z.Value);
  1919. if (group.Any())
  1920. {
  1921. var periodBase= schoolBase.period.Find(z => !string.IsNullOrWhiteSpace(item.period?.id) && z.id.Equals(item.period.id));
  1922. if (periodBase!=null) {
  1923. var subject =periodBase.subjects.Find(z => !string.IsNullOrWhiteSpace(item.subject?.id) &&z.id.Equals(item.subject.id) );
  1924. if (subject!=null) {
  1925. item.subject.bindId = subject.bindId;
  1926. }
  1927. }
  1928. schoolCourses.Add(new CourseStudentDto { courseBase=item, courseTasks=group.ToList() });
  1929. }
  1930. }
  1931. }
  1932. }
  1933. }
  1934. string sqlprivate = $"SELECT distinct value c FROM c join b in c.schedules where c.pk='CourseTask' and b.groupId in({string.Join(",", groups.Select(x => $"'{x.id}'"))}) ";
  1935. var resultTeacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<CourseTask>(sqlprivate, $"CourseTask");
  1936. if (resultTeacher.list.IsNotEmpty())
  1937. {
  1938. HashSet<string> courseIds = new HashSet<string>();
  1939. resultTeacher.list.ForEach(x =>
  1940. {
  1941. var schedulesGroup = x.schedules.Where(z => !string.IsNullOrWhiteSpace(z.groupId) &&groupIds.Contains(z.groupId));
  1942. if (schedulesGroup.Any())
  1943. {
  1944. courseIds.Add(x.courseId);
  1945. CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
  1946. courseTask.schedules=schedulesGroup.ToList();
  1947. courseTask.schedules.ForEach(z => {
  1948. if (!string.IsNullOrWhiteSpace(z.teacherId))
  1949. {
  1950. teacherIds.Add(z.teacherId);
  1951. }
  1952. if (z.assistants!=null)
  1953. {
  1954. foreach (var assistant in z.assistants)
  1955. {
  1956. teacherIds.Add(assistant);
  1957. }
  1958. }
  1959. });
  1960. privateGroupTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
  1961. }
  1962. });
  1963. if (courseIds.Any())
  1964. {
  1965. string sqlCourse = $"select value c from c where c.id in ({string.Join(",", courseIds.Select(b => $"'{b}'"))})";
  1966. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<CourseBase>(sqlCourse, $"CourseBase");
  1967. if (result.list.IsNotEmpty())
  1968. {
  1969. foreach (var item in result.list)
  1970. {
  1971. List<CourseTaskDto> courseTaskDtos = new List<CourseTaskDto>();
  1972. var group = privateGroupTask.Where(x => x.Key.Equals(item.id)).Select(z => z.Value);
  1973. if (group.Any())
  1974. {
  1975. teahcerCourses.Add(new CourseStudentDto { courseBase=item, courseTasks=group.ToList() });
  1976. }
  1977. }
  1978. }
  1979. }
  1980. }
  1981. if (roomIds.Any()) {
  1982. string sqlRoom = $"select value c from c where c.id in ({string.Join(",",roomIds.Select(z=>$"'{z}'"))})";
  1983. var result= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<IdName>(sqlRoom, $"Room-{school}");
  1984. if (result.list.IsNotEmpty())
  1985. {
  1986. rooms.AddRange(result.list);
  1987. }
  1988. }
  1989. if (teacherIds.Any())
  1990. {
  1991. string sqlTeacher = $"select value c from c where c.id in ({string.Join(",", teacherIds.Select(z => $"'{z}'"))})";
  1992. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<IdNameCode>(sqlTeacher, $"Base");
  1993. if (result.list.IsNotEmpty())
  1994. {
  1995. teachers.AddRange(result.list);
  1996. }
  1997. if (teacherIds.Count()>result.list.Count)
  1998. {
  1999. var more = teacherIds.Except(result.list.Select(z => z.id));
  2000. var content = new StringContent(more.ToJsonString(), Encoding.UTF8, "application/json");
  2001. string json = await _coreAPIHttpService.GetUserInfos(content);
  2002. if (!string.IsNullOrWhiteSpace(json))
  2003. {
  2004. List<CoreUser> coreUsers = json.ToObject<List<CoreUser>>();
  2005. teachers.AddRange(coreUsers.Select(c => new IdNameCode { id =c.id, name =c.name, picture=c.picture }));
  2006. }
  2007. }
  2008. }
  2009. }
  2010. return Ok(new { teahcerCourses, schoolCourses, rooms,teachers,groups= groups.Select(z=>new { z.id,z.name , z.type,z.no ,z.school,z.scope,z.periodId,z.year,z.grades})});
  2011. }
  2012. }
  2013. catch (Exception ex)
  2014. {
  2015. await _dingDing.SendBotMsg($"{_option.Location},course-base\teacher{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
  2016. return BadRequest(new { ex.Message });
  2017. }
  2018. return Ok();
  2019. }
  2020. //
  2021. /*
  2022. *x-auth-authtoken: eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0ZXN0LnRlYW1tb2RlbC5jbiIsInN1YiI6IjE1OTUzMjEzNTQiLCJhenAiOiJoYmNuIiwiZXhwIjoxNjgyNjc0MDEwLCJuYW1lIjoi572X6ICB5biIIiwicGljdHVyZSI6Imh0dHBzOi8vY29yZXN0b3JhZ2VzZXJ2aWNlLmJsb2IuY29yZS5jaGluYWNsb3VkYXBpLmNuL2FjY291bnQvYXZhdGFyLzE1OTUzMjEzNTQiLCJyb2xlcyI6WyJ0ZWFjaGVyIiwiYWRtaW4iLCJhcmVhIl0sInBlcm1pc3Npb25zIjpbXSwic3RhbmRhcmQiOiJzdGFuZGFyZDEiLCJzY29wZSI6InRlYWNoZXIiLCJhcmVhIjoiNjllM2Q0MTMtNTBhMS00ZjVlLTg0NGEtZTBmN2M5NjIyZWEzIiwid2Vic2l0ZSI6IklFUyJ9.5-5M9FYQspxvBJy6B5ARwC5mS6lbb5WEeDPXjfo29Hk
  2023. {
  2024. "scope": "school",
  2025. "periodId": "463db08d-cbe7-48a0-a81a-fc39b3c1fep1",
  2026. "grant_type": "teach",
  2027. "year": 2023,
  2028. "semesterId": "08b81e76-e7d2-4001-8b4c-e7c789ef4bs1"
  2029. }
  2030. */
  2031. //http://localhost:5000/course-base/student
  2032. /// <summary>
  2033. /// 教师任教的课程
  2034. /// </summary>
  2035. /// <param name="request"></param>
  2036. /// <returns></returns>
  2037. [ProducesDefaultResponseType]
  2038. [AuthToken(Roles = "teacher,admin", Permissions = "course-upd,course-read")]
  2039. [HttpPost("teacher")]
  2040. [Authorize(Roles = "IES")]
  2041. public async Task<IActionResult> Teacher(JsonElement request)
  2042. {
  2043. try
  2044. {
  2045. (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
  2046. if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
  2047. string code = $"CourseTask-{school}";
  2048. var client = _azureCosmos.GetCosmosClient();
  2049. switch (true)
  2050. {
  2051. //任教学校课程和个人课程
  2052. case bool when $"{grant_type}".Equals("teach", StringComparison.OrdinalIgnoreCase):
  2053. string sql = $"SELECT distinct value c FROM c join b in c.schedules where c.pk='CourseTask' and (ARRAY_CONTAINS(b.assistants,'{tmdid}')or b.teacherId ='{tmdid}' )";
  2054. List<KeyValuePair<string,CourseTask >> schoolTeacherTask = new List<KeyValuePair<string, CourseTask>>();
  2055. List<KeyValuePair<string,CourseTask >> schoolAssistantTask = new List<KeyValuePair<string,CourseTask >>();
  2056. List<KeyValuePair<string,CourseTask >> privateTeacherTask = new List<KeyValuePair<string,CourseTask >>();
  2057. List<KeyValuePair<string,CourseTask >> privateAssistantTask = new List<KeyValuePair<string,CourseTask >>();
  2058. List<CourseDto> schoolCourses = new List<CourseDto>();
  2059. List<CourseDto> teahcerCourses = new List<CourseDto>();
  2060. List<string> groupIds = new List<string>();
  2061. if (!string.IsNullOrWhiteSpace(school))
  2062. {
  2063. School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  2064. JsonElement _year = default, _semesterId = default, _periodId = default;
  2065. if (!request.TryGetProperty("periodId", out _periodId)) return BadRequest();
  2066. if (!request.TryGetProperty("year", out _year))
  2067. {
  2068. return BadRequest();
  2069. }
  2070. if (!request.TryGetProperty("semesterId", out _semesterId))
  2071. {
  2072. return BadRequest();
  2073. }
  2074. var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
  2075. //string date = SchoolService.GetOpensByStudyYearAndSemester(period.semesters, int.Parse($"{_year}"), $"{_semesterId}");
  2076. sql = $"{sql} and c.year={_year} and c.semesterId='{_semesterId}'";
  2077. HashSet<string> courseIds = new HashSet<string>();
  2078. var resultSchool= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseTask>(sql, $"CourseTask-{school}");
  2079. if (resultSchool.list.IsNotEmpty()) {
  2080. resultSchool.list.ForEach(x => {
  2081. var schedulesTeacher = x.schedules.Where(z =>!string.IsNullOrWhiteSpace(z.teacherId) && z.teacherId.Equals(tmdid));
  2082. if (schedulesTeacher.Any())
  2083. {
  2084. courseIds.Add(x.courseId);
  2085. CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
  2086. courseTask.schedules=schedulesTeacher.ToList();
  2087. schoolTeacherTask.Add(new KeyValuePair<string,CourseTask >(x.courseId, courseTask));
  2088. //groupIds.AddRange(schedulesTeacher.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
  2089. }
  2090. var schedulesAssistant = x.schedules.Where(z => z.assistants.Contains(tmdid) );
  2091. if (schedulesAssistant.Any())
  2092. {
  2093. courseIds.Add(x.courseId);
  2094. CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
  2095. courseTask.schedules=schedulesAssistant.ToList();
  2096. schoolAssistantTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
  2097. //groupIds.AddRange(schedulesAssistant.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
  2098. }
  2099. });
  2100. }
  2101. if (courseIds.Any()) {
  2102. string sqlCourse = $"select value c from c where c.id in ({string.Join(",",courseIds.Select(b=>$"'{b}'"))})";
  2103. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseBase>(sqlCourse, $"CourseBase-{school}");
  2104. if (result.list.IsNotEmpty())
  2105. {
  2106. foreach (var item in result.list)
  2107. {
  2108. List<CourseTaskDto> courseTaskDtos = new List<CourseTaskDto>();
  2109. var teacher = schoolTeacherTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask=z.Value, type="teacher" });
  2110. if (teacher.Any()) {
  2111. courseTaskDtos.AddRange(teacher.ToList());
  2112. }
  2113. var assistant= schoolAssistantTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask=z.Value, type="assistant" });
  2114. if (assistant.Any()) {
  2115. courseTaskDtos.AddRange(assistant.ToList());
  2116. }
  2117. schoolCourses.Add(new CourseDto { courseBase=item, courseTasks=courseTaskDtos });
  2118. }
  2119. }
  2120. }
  2121. }
  2122. {
  2123. HashSet<string> courseIds = new HashSet<string>();
  2124. string sqlCoursePrivate = $"select value c.id from c where c.creatorId='{tmdid}'";
  2125. var resultCourseBasePrivate = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<string>(sqlCoursePrivate, $"CourseBase");
  2126. if (resultCourseBasePrivate.list.IsNotEmpty())
  2127. {
  2128. courseIds=new HashSet<string>(resultCourseBasePrivate.list);
  2129. }
  2130. string sqlprivate = $"SELECT distinct value c FROM c join b in c.schedules where c.pk='CourseTask' and (ARRAY_CONTAINS(b.assistants,'{tmdid}')or b.teacherId ='{tmdid}' )";
  2131. var resultTeacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<CourseTask>(sqlprivate, $"CourseTask");
  2132. if (resultTeacher.list.IsNotEmpty())
  2133. {
  2134. resultTeacher.list.ForEach(x => {
  2135. var schedulesTeacher = x.schedules.Where(z => !string.IsNullOrWhiteSpace(z.teacherId) && z.teacherId.Equals(tmdid));
  2136. if (schedulesTeacher.Any())
  2137. {
  2138. courseIds.Add(x.courseId);
  2139. CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
  2140. courseTask.schedules=schedulesTeacher.ToList();
  2141. privateTeacherTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
  2142. groupIds.AddRange(schedulesTeacher.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
  2143. }
  2144. var schedulesAssistant = x.schedules.Where(z => z.assistants.Contains(tmdid));
  2145. if (schedulesAssistant.Any())
  2146. {
  2147. courseIds.Add(x.courseId);
  2148. CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
  2149. courseTask.schedules=schedulesAssistant.ToList();
  2150. privateAssistantTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
  2151. groupIds.AddRange(schedulesAssistant.Where(z=>!string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
  2152. }
  2153. });
  2154. }
  2155. if (courseIds.Any())
  2156. {
  2157. string sqlCourse = $"select distinct value c from c where c.code='CourseBase' and ( c.creatorId='{tmdid}' or c.id in ({string.Join(",", courseIds.Select(b => $"'{b}'"))}))";
  2158. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<CourseBase>(sqlCourse, $"CourseBase");
  2159. if (result.list.IsNotEmpty())
  2160. {
  2161. foreach (var item in result.list)
  2162. {
  2163. List<CourseTaskDto> courseTaskDtos = new List<CourseTaskDto>();
  2164. var teacher = privateTeacherTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask=z.Value, type="teacher" });
  2165. if (teacher.Any())
  2166. {
  2167. courseTaskDtos.AddRange(teacher.ToList());
  2168. }
  2169. var assistant = privateAssistantTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask=z.Value, type="assistant" });
  2170. if (assistant.Any())
  2171. {
  2172. courseTaskDtos.AddRange(assistant.ToList());
  2173. }
  2174. teahcerCourses.Add(new CourseDto { courseBase=item, courseTasks=courseTaskDtos });
  2175. }
  2176. }
  2177. }
  2178. //个人,
  2179. //学校,
  2180. //助教,学校。
  2181. //助教,个人。
  2182. var groupIdsRel= groupIds.GroupBy(z => z).Select(z => new { groupId = z.Key, count = z.ToList().Count() });
  2183. return Ok(new { teahcerCourses, schoolCourses, groupIdsRel });
  2184. }
  2185. }
  2186. }
  2187. catch (Exception ex)
  2188. {
  2189. await _dingDing.SendBotMsg($"{_option.Location},course-base\teacher{ex.Message}\n{ex.StackTrace}",GroupNames.成都开发測試群組);
  2190. return BadRequest(new { ex.Message});
  2191. }
  2192. return Ok();
  2193. }
  2194. /// <summary>
  2195. ///
  2196. /// </summary>
  2197. /// <param name="request"></param>
  2198. /// <returns></returns>
  2199. /*
  2200. [ProducesDefaultResponseType]
  2201. [HttpPost("data-migration-to-class")]
  2202. public async Task<IActionResult> DataMigrationToClass(JsonElement request)
  2203. {
  2204. try
  2205. {
  2206. List<Course> schoolCourses = new List<Course>();
  2207. HashSet<string> schoolIds = new HashSet<string>();
  2208. string sql = "select value c from c where c.pk='Course' ";
  2209. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetItemQueryIteratorSql<Course>(queryText: sql))
  2210. {
  2211. schoolCourses.Add(item);
  2212. if (!string.IsNullOrWhiteSpace(item.school))
  2213. {
  2214. if (item.school.Equals("ydzt") ||item.school.Equals("xcfx") ||item.school.Equals("hlgj") ||item.school.Equals("hbcn") ||item.school.Equals("kjyxx") ||item.school.Equals("bjgsex") || item.school.Equals("cdxxps") ||item.school.Equals("pclxxx"))
  2215. {
  2216. }
  2217. else
  2218. {
  2219. schoolCourses.Add(item);
  2220. schoolIds.Add(item.school);
  2221. }
  2222. }
  2223. //if (!string.IsNullOrWhiteSpace(item.school))
  2224. //{
  2225. // schoolIds.Add(item.school);
  2226. //}
  2227. }
  2228. List<School> schools = new List<School>();
  2229. if (schoolIds.Count>0)
  2230. {
  2231. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<School>($"select value c from c where c.id in ({string.Join(",", schoolIds.Select(z => $"'{z}'"))})", "Base");
  2232. if (result.list.IsNotEmpty())
  2233. {
  2234. schools.AddRange(result.list);
  2235. }
  2236. }
  2237. List<CourseDto> schoolCourseDtos = new List<CourseDto>();
  2238. int coureseIndex = 1;
  2239. foreach (var course in schoolCourses)
  2240. {
  2241. var school = schools.Find(z => z.id.Equals(course.school));
  2242. if (school==null) { continue; }
  2243. var period = school.period.Find(z => z.id.Equals(course.period?.id));
  2244. if (period==null)
  2245. {
  2246. continue;
  2247. }
  2248. //当前学年
  2249. var semester = SchoolService.GetSemester(period, DateTimeOffset.Now.ToUnixTimeMilliseconds());
  2250. ResponseMessage response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(course.id, new PartitionKey($"CourseBase-{school.id}"));
  2251. if (response.StatusCode==System.Net.HttpStatusCode.OK) {
  2252. CourseBase courseBase = JsonDocument.Parse(response.Content).RootElement.ToObject<CourseBase>();
  2253. if (courseBase!= null) {
  2254. if (string.IsNullOrWhiteSpace(courseBase.no))
  2255. {
  2256. //生成新的课程编号
  2257. string sqlNo = $"select value c.no from c where c.period.id='{courseBase.period.id}' ";
  2258. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<string>(sqlNo, courseBase.code);
  2259. if (result.list.IsNotEmpty())
  2260. {
  2261. if (period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))>0)
  2262. {
  2263. int index = period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id)) +1;
  2264. var nos = result.list.FindAll(x => !string.IsNullOrWhiteSpace(x) && x.StartsWith($"{index}")).ToHashSet<string>();
  2265. if (nos != null)
  2266. {
  2267. string couresNo = string.Empty;
  2268. List<string> order = nos.Where(y => !string.IsNullOrEmpty(y) && Regex.IsMatch(y, @"^\d*$")).OrderBy(x => int.Parse(x)).ToList();
  2269. if (!order.Contains($"{index}00"))
  2270. {
  2271. order.Insert(0, $"{index}00");
  2272. }
  2273. if (order != null)
  2274. {
  2275. if (!order.Contains($"{index}00"))
  2276. {
  2277. order.Insert(0, $"{index}00");
  2278. }
  2279. }
  2280. else { order = new List<string>() { $"{index}00" }; }
  2281. for (int i = 0; i < order.Count; i++)
  2282. {
  2283. couresNo = $"{int.Parse(order[i]) + 1}";
  2284. int no = i + 1;
  2285. if (no <= order.Count - 1)
  2286. {
  2287. if (!couresNo.Equals(order[no]))
  2288. {
  2289. break;
  2290. }
  2291. }
  2292. }
  2293. if (string.IsNullOrWhiteSpace(couresNo))
  2294. {
  2295. couresNo=$"{index}99";
  2296. }
  2297. courseBase.no=couresNo;
  2298. }
  2299. else
  2300. {
  2301. courseBase.no= $"{index}01";
  2302. }
  2303. }
  2304. else
  2305. {
  2306. courseBase.no=$"{coureseIndex}99";
  2307. }
  2308. }
  2309. else
  2310. {
  2311. if (period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))>0)
  2312. {
  2313. courseBase.no= $"{(period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))+1)}01";
  2314. }
  2315. else
  2316. {
  2317. courseBase.no=$"{coureseIndex}99";
  2318. }
  2319. }
  2320. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(courseBase, new PartitionKey(courseBase.code));
  2321. }
  2322. for (int grade = 0; grade<period.grades.Count; grade++) {
  2323. if (courseBase.grade==grade) {
  2324. continue;
  2325. }
  2326. coureseIndex=+1;
  2327. string sqlBaseData = $"select value c from c where c.name ='{course.name}' and c.grade={grade} and c.period.id='{period.id}' and c.subject.id='{course.subject.id}'";
  2328. var resultBaseData = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseBase>(sqlBaseData, $"CourseBase-{school.id}");
  2329. if (!resultBaseData.list.IsNotEmpty()) {
  2330. CourseBase courseBaseNew = new CourseBase()
  2331. {
  2332. id= Guid.NewGuid().ToString(),
  2333. code=$"CourseBase-{school.id}",
  2334. pk="CourseBase",
  2335. ttl=-1,
  2336. name=course.name,
  2337. subject= new IdName { id=course.subject?.id, name=course.subject?.name },
  2338. period= new IdName { id= course.period?.id, name =course.period?.name },
  2339. school=school.id,
  2340. scope="school",
  2341. creatorId=course.creatorId,
  2342. desc=course.desc,
  2343. status=1,
  2344. grade=grade,
  2345. };
  2346. //生成新的课程编号
  2347. string sqlNo = $"select value c.no from c where c.period.id='{courseBase.period.id}' ";
  2348. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<string>(sqlNo, courseBase.code);
  2349. if (result.list.IsNotEmpty())
  2350. {
  2351. if (period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))>0)
  2352. {
  2353. int index = period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id)) +1;
  2354. var nos = result.list.FindAll(x => !string.IsNullOrWhiteSpace(x) && x.StartsWith($"{index}")).ToHashSet<string>();
  2355. if (nos != null)
  2356. {
  2357. string couresNo = string.Empty;
  2358. List<string> order = nos.Where(y => !string.IsNullOrEmpty(y) && Regex.IsMatch(y, @"^\d*$")).OrderBy(x => int.Parse(x)).ToList();
  2359. if (!order.Contains($"{index}00"))
  2360. {
  2361. order.Insert(0, $"{index}00");
  2362. }
  2363. if (order != null)
  2364. {
  2365. if (!order.Contains($"{index}00"))
  2366. {
  2367. order.Insert(0, $"{index}00");
  2368. }
  2369. }
  2370. else { order = new List<string>() { $"{index}00" }; }
  2371. for (int i = 0; i < order.Count; i++)
  2372. {
  2373. couresNo = $"{int.Parse(order[i]) + 1}";
  2374. int no = i + 1;
  2375. if (no <= order.Count - 1)
  2376. {
  2377. if (!couresNo.Equals(order[no]))
  2378. {
  2379. break;
  2380. }
  2381. }
  2382. }
  2383. if (string.IsNullOrWhiteSpace(couresNo))
  2384. {
  2385. couresNo=$"{index}99";
  2386. }
  2387. courseBase.no=couresNo;
  2388. }
  2389. else
  2390. {
  2391. courseBase.no= $"{index}01";
  2392. }
  2393. }
  2394. else
  2395. {
  2396. courseBase.no=$"{coureseIndex}99";
  2397. }
  2398. }
  2399. else
  2400. {
  2401. if (period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))>0)
  2402. {
  2403. courseBase.no= $"{(period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))+1)}01";
  2404. }
  2405. else
  2406. {
  2407. courseBase.no=$"{coureseIndex}99";
  2408. }
  2409. }
  2410. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(courseBaseNew, new PartitionKey(courseBaseNew.code));
  2411. }
  2412. }
  2413. }
  2414. }
  2415. List<ScheduleTask> schedules = new List<ScheduleTask>();
  2416. foreach (var schedule in course.schedule)
  2417. {
  2418. ScheduleTask scheduleSave = null;
  2419. int grade = -1;
  2420. if (!string.IsNullOrWhiteSpace(schedule.teacherId) && !string.IsNullOrWhiteSpace(schedule.classId))
  2421. {
  2422. scheduleSave =new ScheduleTask() { type="class", groupId=schedule.classId, teacherId=schedule.teacherId, roomId= schedule.room, school=school.id };
  2423. try
  2424. {
  2425. Class clazz = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<Class>(schedule.classId, new PartitionKey($"Class-{school.id}"));
  2426. if (semester.studyYear- clazz.year>=period.grades.Count)
  2427. {
  2428. grade=-1;
  2429. }
  2430. else {
  2431. var gradeData = SchoolService.GetGrades(school, period.id, new List<int>() { clazz.year }, DateTimeOffset.Now.ToUnixTimeMilliseconds());
  2432. if (gradeData.grades.Any() && gradeData.grades.Count>0)
  2433. {
  2434. int.TryParse(gradeData.grades.First(), out grade);
  2435. }
  2436. }
  2437. }
  2438. catch { }
  2439. }
  2440. if (!string.IsNullOrWhiteSpace(schedule.teacherId) && !string.IsNullOrWhiteSpace(schedule.stulist))
  2441. {
  2442. scheduleSave = new ScheduleTask() { type="teach", groupId=schedule.stulist, teacherId=schedule.teacherId, roomId= schedule.room, school=school.id };
  2443. if (grade==-1)
  2444. {
  2445. _coreAPIHttpService.check=false;
  2446. var groups = await GroupListService.GetMemberByListids(_coreAPIHttpService, _azureCosmos.GetCosmosClient(), _dingDing, new List<string> { schedule.stulist }, school.id);
  2447. if (groups.rmembers.IsNotEmpty())
  2448. {
  2449. var a = groups.rmembers.Where(z => z.type==2 && z.year>0).GroupBy(z => z.year).Select(z => new { key = z.Key, list = z.ToList() }).OrderByDescending(y => y.list.Count).FirstOrDefault();
  2450. if (a!=null)
  2451. {
  2452. if (semester.studyYear- a.key>=period.grades.Count)
  2453. {
  2454. grade=-1;
  2455. }
  2456. else {
  2457. var gradeData = SchoolService.GetGrades(school, period.id, new List<int>() { a.key }, DateTimeOffset.Now.ToUnixTimeMilliseconds());
  2458. if (gradeData.grades.Any() && gradeData.grades.Count>0)
  2459. {
  2460. int.TryParse(gradeData.grades.First(), out grade);
  2461. }
  2462. }
  2463. }
  2464. }
  2465. }
  2466. }
  2467. if (grade>-1) {
  2468. string sqlCourse = $"select value c from c where c.name ='{course.name}' and c.grade={grade} and c.period.id='{period.id}' and c.subject.id='{course.subject?.id}' ";
  2469. var resultCourseBase= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseBase>(sqlCourse,$"CourseBase-{school.id}");
  2470. foreach (var item in resultCourseBase.list) {
  2471. if (semester.currSemester!=null)
  2472. {
  2473. string id = $"{semester.studyYear}-{semester.currSemester.id}-{item.id}";
  2474. string code = $"CourseTask-{school.id}";
  2475. ResponseMessage responseTask= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(id, new PartitionKey(code));
  2476. CourseTask courseTask = null;
  2477. if (responseTask.StatusCode==System.Net.HttpStatusCode.OK)
  2478. {
  2479. courseTask = JsonDocument.Parse(responseTask.Content).RootElement.ToObject<CourseTask>();
  2480. var scheduleExsit = courseTask.schedules.Find(z => z.groupId.Equals(scheduleSave.groupId));
  2481. if (scheduleExsit==null)
  2482. {
  2483. courseTask.schedules.Add(scheduleSave);
  2484. }
  2485. else {
  2486. scheduleExsit.teacherId=scheduleSave.teacherId;
  2487. }
  2488. }
  2489. else {
  2490. courseTask = new CourseTask
  2491. {
  2492. id = id,
  2493. code = code,
  2494. pk="CourseTask",
  2495. ttl=-1,
  2496. courseId=item.id,
  2497. year= semester.studyYear,
  2498. expire= semester.nextSemester.AddDays(-1).ToUnixTimeMilliseconds(),
  2499. semesterId=semester.currSemester.id,
  2500. schedules=new List<ScheduleTask>() { scheduleSave }
  2501. };
  2502. }
  2503. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(courseTask, new PartitionKey(code));
  2504. }
  2505. }
  2506. }
  2507. }
  2508. }
  2509. return Ok(new { schoolCourseDtos });
  2510. }
  2511. catch (Exception ex) { return Ok($"{ex.Message},{ex.StackTrace}"); }
  2512. return Ok();
  2513. }
  2514. */
  2515. /// <summary>
  2516. ///
  2517. /// </summary>
  2518. /// <param name="request"></param>
  2519. /// <returns></returns>
  2520. [ProducesDefaultResponseType]
  2521. [HttpPost("data-migration")]
  2522. public async Task<IActionResult> DataMigration(JsonElement request) {
  2523. try {
  2524. List<Course> teacherCourses = new List<Course>();
  2525. List<Course> schoolCourses = new List<Course>();
  2526. HashSet<string> schoolIds = new HashSet<string>();
  2527. string sql = "select value c from c where c.pk='Course' ";
  2528. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetItemQueryIteratorSql<Course>(queryText: sql))
  2529. {
  2530. if (!string.IsNullOrWhiteSpace(item.school))
  2531. {
  2532. schoolCourses.Add(item);
  2533. schoolIds.Add(item.school);
  2534. if (item.school.Equals("ydzt") ||item.school.Equals("xcfx") ||item.school.Equals("hlgj") ||item.school.Equals("hbcn") ||item.school.Equals("kjyxx") ||item.school.Equals("bjgsex") || item.school.Equals("cdxxps") ||item.school.Equals("pclxxx"))
  2535. {
  2536. }
  2537. else
  2538. {
  2539. }
  2540. }
  2541. }
  2542. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetItemQueryIteratorSql<Course>(sql))
  2543. {
  2544. teacherCourses.Add(item);
  2545. }
  2546. List<School> schools = new List<School>();
  2547. if (schoolIds.Count>0)
  2548. {
  2549. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<School>($"select value c from c where c.id in ({string.Join(",", schoolIds.Select(z => $"'{z}'"))})", "Base");
  2550. if (result.list.IsNotEmpty())
  2551. {
  2552. schools.AddRange(result.list);
  2553. }
  2554. }
  2555. List<CourseDto> schoolCourseDtos = new List<CourseDto>();
  2556. int coureseIndex = 1;
  2557. foreach (var course in schoolCourses)
  2558. {
  2559. var school = schools.Find(z => z.id.Equals(course.school));
  2560. if (school==null) { continue; }
  2561. var period = school.period.Find(z => z.id.Equals(course.period?.id));
  2562. if(period==null)
  2563. {
  2564. continue;
  2565. }
  2566. var semester = SchoolService.GetSemester(period,time: "2023-07-01");
  2567. CourseBase courseBase = null;
  2568. ResponseMessage response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(course.id, new PartitionKey($"CourseBase-{school.id}"));
  2569. if (response.StatusCode==System.Net.HttpStatusCode.OK)
  2570. {
  2571. courseBase = JsonDocument.Parse(response.Content).RootElement.ToObject<CourseBase>();
  2572. if (courseBase!= null)
  2573. {
  2574. //生成新的课程编号
  2575. string sqlNo = $"select value c.no from c where c.period.id='{courseBase.period.id}' ";
  2576. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<string>(sqlNo, courseBase.code);
  2577. if (result.list.IsNotEmpty())
  2578. {
  2579. if (period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))>0)
  2580. {
  2581. int index = period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id)) +1;
  2582. var nos = result.list.FindAll(x => !string.IsNullOrWhiteSpace(x) && x.StartsWith($"{index}")).ToHashSet<string>();
  2583. if (nos != null)
  2584. {
  2585. string couresNo = string.Empty;
  2586. List<string> order = nos.Where(y => !string.IsNullOrEmpty(y) && Regex.IsMatch(y, @"^\d*$")).OrderBy(x => int.Parse(x)).ToList();
  2587. if (!order.Contains($"{index}00"))
  2588. {
  2589. order.Insert(0, $"{index}00");
  2590. }
  2591. if (order != null)
  2592. {
  2593. if (!order.Contains($"{index}00"))
  2594. {
  2595. order.Insert(0, $"{index}00");
  2596. }
  2597. }
  2598. else { order = new List<string>() { $"{index}00" }; }
  2599. for (int i = 0; i < order.Count; i++)
  2600. {
  2601. couresNo = $"{int.Parse(order[i]) + 1}";
  2602. int no = i + 1;
  2603. if (no <= order.Count - 1)
  2604. {
  2605. if (!couresNo.Equals(order[no]))
  2606. {
  2607. break;
  2608. }
  2609. }
  2610. }
  2611. if (string.IsNullOrWhiteSpace(couresNo))
  2612. {
  2613. couresNo=$"{index}99";
  2614. }
  2615. courseBase.no=couresNo;
  2616. }
  2617. else
  2618. {
  2619. courseBase.no= $"{index}01";
  2620. }
  2621. }
  2622. else {
  2623. courseBase.no=$"{coureseIndex}99";
  2624. }
  2625. }
  2626. else
  2627. {
  2628. if (period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))>0)
  2629. {
  2630. courseBase.no= $"{(period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))+1)}01";
  2631. }
  2632. else {
  2633. courseBase.no=$"{coureseIndex}99";
  2634. }
  2635. }
  2636. }
  2637. }
  2638. else {
  2639. courseBase = new CourseBase()
  2640. {
  2641. id= course.id,
  2642. code=$"CourseBase-{school.id}",
  2643. pk="CourseBase",
  2644. ttl=-1,
  2645. name=course.name,
  2646. subject= new IdName { id=course.subject?.id, name=course.subject?.name },
  2647. period= new IdName { id= course.period?.id, name =course.period?.name },
  2648. school=school.id,
  2649. scope="school",
  2650. no=course.no,
  2651. creatorId=course.creatorId,
  2652. desc=course.desc,
  2653. status=1,
  2654. grade=0,
  2655. };
  2656. //生成新的课程编号
  2657. string sqlNo = $"select value c.no from c where c.period.id='{courseBase.period.id}' ";
  2658. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<string>(sqlNo, courseBase.code);
  2659. if (result.list.IsNotEmpty())
  2660. {
  2661. if (period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))>0)
  2662. {
  2663. int index = period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id)) +1;
  2664. var nos = result.list.FindAll(x => !string.IsNullOrWhiteSpace(x) && x.StartsWith($"{index}")).ToHashSet<string>();
  2665. if (nos != null)
  2666. {
  2667. string couresNo = string.Empty;
  2668. List<string> order = nos.Where(y => !string.IsNullOrEmpty(y) && Regex.IsMatch(y, @"^\d*$")).OrderBy(x => int.Parse(x)).ToList();
  2669. if (!order.Contains($"{index}00"))
  2670. {
  2671. order.Insert(0, $"{index}00");
  2672. }
  2673. if (order != null)
  2674. {
  2675. if (!order.Contains($"{index}00"))
  2676. {
  2677. order.Insert(0, $"{index}00");
  2678. }
  2679. }
  2680. else { order = new List<string>() { $"{index}00" }; }
  2681. for (int i = 0; i < order.Count; i++)
  2682. {
  2683. couresNo = $"{int.Parse(order[i]) + 1}";
  2684. int no = i + 1;
  2685. if (no <= order.Count - 1)
  2686. {
  2687. if (!couresNo.Equals(order[no]))
  2688. {
  2689. break;
  2690. }
  2691. }
  2692. }
  2693. if (string.IsNullOrWhiteSpace(couresNo))
  2694. {
  2695. couresNo=$"{index}99";
  2696. }
  2697. courseBase.no=couresNo;
  2698. }
  2699. else
  2700. {
  2701. courseBase.no= $"{index}01";
  2702. }
  2703. }
  2704. else
  2705. {
  2706. courseBase.no=$"{coureseIndex}99";
  2707. }
  2708. }
  2709. else
  2710. {
  2711. if (period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))>0)
  2712. {
  2713. courseBase.no= $"{(period.subjects.FindIndex(z => z.id.Equals(courseBase.subject.id))+1)}01";
  2714. }
  2715. else
  2716. {
  2717. courseBase.no=$"{coureseIndex}99";
  2718. }
  2719. }
  2720. }
  2721. List<ScheduleTask> schedules = new List<ScheduleTask>();
  2722. int grade = -1;
  2723. foreach (var schedule in course.schedule)
  2724. {
  2725. if (!string.IsNullOrWhiteSpace(schedule.teacherId) && !string.IsNullOrWhiteSpace(schedule.classId))
  2726. {
  2727. schedules.Add(new ScheduleTask() { type="class", groupId=schedule.classId, teacherId=schedule.teacherId, roomId= schedule.room, school=school.id });
  2728. try {
  2729. Class clazz = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<Class>(schedule.classId, new PartitionKey($"Class-{school.id}"));
  2730. var gradeData = SchoolService.GetGrades(school, period.id, new List<int>() { clazz.year }, 1688140800000);
  2731. if (gradeData.grades.Any() && gradeData.grades.Count>0)
  2732. {
  2733. int.TryParse(gradeData.grades.First(), out grade);
  2734. }
  2735. } catch { }
  2736. }
  2737. if (!string.IsNullOrWhiteSpace(schedule.teacherId) && !string.IsNullOrWhiteSpace(schedule.stulist))
  2738. {
  2739. schedules.Add(new ScheduleTask() { type="teach", groupId=schedule.stulist, teacherId=schedule.teacherId, roomId= schedule.room, school=school.id });
  2740. if (grade==-1)
  2741. {
  2742. _coreAPIHttpService.check=false;
  2743. var groups = await GroupListService.GetMemberByListids(_coreAPIHttpService, _azureCosmos.GetCosmosClient(), _dingDing, new List<string> { schedule.stulist }, school.id);
  2744. if (groups.rmembers.IsNotEmpty())
  2745. {
  2746. var a = groups.rmembers.Where(z => z.type==2 && z.year>0).GroupBy(z => z.year).Select(z => new { key = z.Key, list = z.ToList() }).OrderByDescending(y => y.list.Count).FirstOrDefault();
  2747. if (a!=null)
  2748. {
  2749. var gradeData = SchoolService.GetGrades(school, period.id, new List<int>() { a.key }, 1688140800000);
  2750. if (gradeData.grades.Any() && gradeData.grades.Count>0)
  2751. {
  2752. int.TryParse(gradeData.grades.First(), out grade);
  2753. }
  2754. }
  2755. }
  2756. }
  2757. }
  2758. }
  2759. if (grade>-1)
  2760. {
  2761. courseBase.grade=grade;
  2762. }
  2763. CourseDto courseDto = new CourseDto();
  2764. courseDto.courseBase=courseBase;
  2765. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(courseBase, new PartitionKey(courseBase.code));
  2766. if (schedules.IsNotEmpty())
  2767. {
  2768. if (semester.currSemester!=null)
  2769. {
  2770. string id = $"{semester.studyYear}-{semester.currSemester.id}-{courseBase.id}";
  2771. string code = $"CourseTask-{school.id}";
  2772. CourseTask courseTask = new CourseTask
  2773. {
  2774. id = id,
  2775. code = code,
  2776. pk="CourseTask",
  2777. ttl=-1,
  2778. courseId=courseBase.id,
  2779. year= semester.studyYear,
  2780. expire= semester.nextSemester.AddDays(-1).ToUnixTimeMilliseconds(),
  2781. semesterId=semester.currSemester.id,
  2782. schedules=schedules
  2783. };
  2784. courseDto.courseTasks.Add(new CourseTaskDto { courseTask=courseTask, type="school" });
  2785. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(courseTask, new PartitionKey(code));
  2786. }
  2787. }
  2788. coureseIndex = +1;
  2789. schoolCourseDtos.Add(courseDto);
  2790. }
  2791. List<CourseDto> teacherCourseDtos = new List<CourseDto>();
  2792. foreach (var course in teacherCourses)
  2793. {
  2794. CourseBase courseBase = new CourseBase()
  2795. {
  2796. id= course.id,
  2797. code=$"CourseBase",
  2798. pk="CourseBase",
  2799. ttl=-1,
  2800. name=course.name,
  2801. scope="private",
  2802. no=course.no,
  2803. creatorId=course.creatorId,
  2804. desc=course.desc,
  2805. status=1,
  2806. };
  2807. List<ScheduleTask> schedules = new List<ScheduleTask>();
  2808. foreach (var schedule in course.schedule)
  2809. {
  2810. if (!string.IsNullOrWhiteSpace(schedule.teacherId) && !string.IsNullOrWhiteSpace(schedule.classId))
  2811. {
  2812. schedules.Add(new ScheduleTask() { type="class", groupId=schedule.classId, teacherId=schedule.teacherId, roomId= schedule.room });
  2813. }
  2814. if (!string.IsNullOrWhiteSpace(schedule.teacherId) && !string.IsNullOrWhiteSpace(schedule.stulist))
  2815. {
  2816. schedules.Add(new ScheduleTask() { type="teach", groupId=schedule.stulist, teacherId=schedule.teacherId, roomId= schedule.room });
  2817. }
  2818. }
  2819. CourseDto courseDto = new CourseDto();
  2820. courseDto.courseBase=courseBase;
  2821. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(courseBase, new PartitionKey(courseBase.code));
  2822. if (schedules.IsNotEmpty())
  2823. {
  2824. string id = $"{courseBase.id}";
  2825. string code = $"CourseTask";
  2826. CourseTask courseTask = new CourseTask
  2827. {
  2828. id = id,
  2829. code = code,
  2830. pk="CourseTask",
  2831. ttl=-1,
  2832. courseId=courseBase.id,
  2833. schedules=schedules
  2834. };
  2835. courseDto.courseTasks.Add(new CourseTaskDto { courseTask=courseTask, type="private" });
  2836. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(courseTask, new PartitionKey(code));
  2837. }
  2838. teacherCourseDtos.Add(courseDto);
  2839. }
  2840. return Ok(new { schoolCourseDtos, teacherCourseDtos });
  2841. } catch (Exception ex ){ return Ok($"{ex.Message},{ex.StackTrace}"); }
  2842. }
  2843. /// <summary>
  2844. ///
  2845. /// </summary>
  2846. /// <param name="request"></param>
  2847. /// <returns></returns>
  2848. [ProducesDefaultResponseType]
  2849. [HttpPost("data-migration-private-course")]
  2850. public async Task<IActionResult> DataMigrationPrivateCourse(JsonElement request)
  2851. {
  2852. try
  2853. {
  2854. List<Course> teacherCourses = new List<Course>();
  2855. string sql = "select value c from c where c.pk='Course' ";
  2856. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetItemQueryIteratorSql<Course>(sql))
  2857. {
  2858. teacherCourses.Add(item);
  2859. }
  2860. List<CourseDto> teacherCourseDtos = new List<CourseDto>();
  2861. foreach (var course in teacherCourses)
  2862. {
  2863. CourseBase courseBase = null;
  2864. ResponseMessage responseCourse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync(course.id, new PartitionKey("CourseBase"));
  2865. if (responseCourse.StatusCode==System.Net.HttpStatusCode.OK)
  2866. {
  2867. courseBase= JsonDocument.Parse(responseCourse.Content).RootElement.ToObject<CourseBase>();
  2868. }
  2869. else {
  2870. courseBase = new CourseBase()
  2871. {
  2872. id= course.id,
  2873. code="CourseBase",
  2874. pk="CourseBase",
  2875. ttl=-1,
  2876. name=course.name,
  2877. scope="private",
  2878. no=course.no,
  2879. creatorId=course.creatorId,
  2880. desc=course.desc,
  2881. status=1,
  2882. };
  2883. }
  2884. List<ScheduleTask> schedules = new List<ScheduleTask>();
  2885. foreach (var schedule in course.schedule)
  2886. {
  2887. if (!string.IsNullOrWhiteSpace(schedule.teacherId) && !string.IsNullOrWhiteSpace(schedule.classId))
  2888. {
  2889. schedules.Add(new ScheduleTask() { type="class", groupId=schedule.classId, teacherId=schedule.teacherId, roomId= schedule.room });
  2890. }
  2891. if (!string.IsNullOrWhiteSpace(schedule.teacherId) && !string.IsNullOrWhiteSpace(schedule.stulist))
  2892. {
  2893. schedules.Add(new ScheduleTask() { type="teach", groupId=schedule.stulist, teacherId=schedule.teacherId, roomId= schedule.room });
  2894. }
  2895. }
  2896. CourseDto courseDto = new CourseDto();
  2897. courseDto.courseBase=courseBase;
  2898. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(courseBase, new PartitionKey(courseBase.code));
  2899. if (schedules.IsNotEmpty())
  2900. {
  2901. string id = $"{courseBase.id}";
  2902. string code = $"CourseTask";
  2903. CourseTask courseTask = null;
  2904. //处理之前迁移过,的排课任务,但是又新增了新的排课,防止 新的排课被覆盖.
  2905. ResponseMessage response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync(id, new PartitionKey(code));
  2906. if (response.StatusCode==System.Net.HttpStatusCode.OK)
  2907. {
  2908. courseTask= JsonDocument.Parse(response.Content).RootElement.ToObject<CourseTask>();
  2909. foreach (var item in schedules) {
  2910. //查询是否有相同的排课
  2911. var schedule = courseTask.schedules.Find(z => z.type.Equals(item.type) && z.groupId.Equals(item.groupId) && z.teacherId.Equals(item.teacherId));
  2912. if (schedule==null) {
  2913. courseTask.schedules.Add(item);
  2914. }
  2915. }
  2916. }
  2917. else {
  2918. courseTask = new CourseTask
  2919. {
  2920. id = id,
  2921. code = code,
  2922. pk="CourseTask",
  2923. ttl=-1,
  2924. courseId=courseBase.id,
  2925. schedules=schedules
  2926. };
  2927. }
  2928. courseDto.courseTasks.Add(new CourseTaskDto { courseTask=courseTask, type="private" });
  2929. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(courseTask, new PartitionKey(code));
  2930. }
  2931. teacherCourseDtos.Add(courseDto);
  2932. }
  2933. return Ok(new { teacherCourseDtos });
  2934. }
  2935. catch (Exception ex) { return Ok($"{ex.Message},{ex.StackTrace}"); }
  2936. }
  2937. }
  2938. }