LessonSticsController.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. using Microsoft.AspNetCore.Http;
  2. using Microsoft.AspNetCore.Mvc;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using TEAMModelOS.Models;
  8. using TEAMModelOS.SDK.DI;
  9. using Microsoft.Extensions.Options;
  10. using Azure.Cosmos;
  11. using System.Text.Json;
  12. using TEAMModelOS.SDK.Models.Cosmos.Common;
  13. using TEAMModelOS.SDK.Models;
  14. using TEAMModelBI.Models;
  15. using TEAMModelOS.SDK.Extension;
  16. using System.Text;
  17. using TEAMModelBI.Tool;
  18. using MathNet.Numerics.LinearAlgebra.Double;
  19. using TEAMModelBI.Tool.CosmosBank;
  20. using TEAMModelBI.Tool.Context;
  21. namespace TEAMModelBI.Controllers.Census
  22. {
  23. [Route("lesson")]
  24. [ApiController]
  25. public class LessonSticsController : ControllerBase
  26. {
  27. private readonly AzureCosmosFactory _azureCosmos;
  28. private readonly AzureStorageFactory _azureStorage;
  29. private readonly DingDing _dingDing;
  30. private readonly Option _option;
  31. public LessonSticsController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureFactory, DingDing dingDing, IOptionsSnapshot<Option> option)
  32. {
  33. _azureCosmos = azureCosmos;
  34. _azureStorage = azureFactory;
  35. _dingDing = dingDing;
  36. _option = option?.Value;
  37. }
  38. /// <summary>
  39. /// 查询课例数量
  40. /// </summary>
  41. /// <param name="jsonElement"></param>
  42. /// <returns></returns>
  43. [HttpPost("get-count")]
  44. public async Task<IActionResult> GetCount(JsonElement jsonElement)
  45. {
  46. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  47. if (!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
  48. jsonElement.TryGetProperty("site", out JsonElement site);
  49. var cosmosClient = _azureCosmos.GetCosmosClient();
  50. if ($"{site}".Equals(BIConst.GlobalSite))
  51. cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.GlobalSite);
  52. var (start, end) = TimeHelper.GetTermStartOrEnd(DateTime.Now);
  53. object totals = new();
  54. StringBuilder sqlTxt = new($"select COUNT(c.id) AS totals from c where c.pk='LessonRecord'");
  55. if (!string.IsNullOrEmpty($"{tmdId}"))
  56. {
  57. List<SchoolLen> schoolLens = new();
  58. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  59. foreach (var itemId in schoolIds)
  60. {
  61. School school = new();
  62. var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(itemId, new PartitionKey("Base"));
  63. if (response.Status == 200)
  64. {
  65. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  66. school = json.ToObject<School>();
  67. }
  68. SchoolLen schoolLen = new() { id = itemId, name =
  69. school.name != null ? school.name : itemId };
  70. //string sqlTxt = $"SELECT COUNT(c.id) AS totals FROM c WHERE c.code='LessonRecord-{itemId}'";
  71. sqlTxt.Append($" WHERE c.code='LessonRecord-{itemId}'");
  72. if (bool.Parse($"{term}") == true)
  73. {
  74. sqlTxt.Append($" and c.startTime >= {start} and c.startTime <= {end}");
  75. }
  76. schoolLen.totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School" });
  77. schoolLens.Add(schoolLen);
  78. }
  79. totals = schoolLens;
  80. }
  81. else
  82. {
  83. sqlTxt.Append($" where c.pk='LessonRecord'");
  84. if (bool.Parse($"{term}") == true)
  85. {
  86. sqlTxt.Append($" and c.startTime >= {start} and c.startTime <= {end}");
  87. }
  88. totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School","Teacher" });
  89. }
  90. return Ok(new { state = 200, totals });
  91. }
  92. /// <summary>
  93. /// 统计所有课例数量
  94. /// </summary>
  95. /// <returns></returns>
  96. [HttpPost("get-total")]
  97. public async Task<IActionResult> GetAllCount(JsonElement jsonElement)
  98. {
  99. try
  100. {
  101. jsonElement.TryGetProperty("site", out JsonElement site);
  102. var cosmosClient = _azureCosmos.GetCosmosClient();
  103. if ($"{site}".Equals(BIConst.GlobalSite))
  104. cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.GlobalSite);
  105. string lessonSql = $"select COUNT(c.id) AS totals from c where c.pk='LessonRecord'";
  106. long total = await CommonFind.FindTotals(cosmosClient, lessonSql, new List<string>() { "School","Teacher" });
  107. return Ok(new { state = 200, total });
  108. }
  109. catch (Exception ex)
  110. {
  111. await _dingDing.SendBotMsg($"BI,{_option.Location} /lesson/get-total \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
  112. return BadRequest();
  113. }
  114. }
  115. /// <summary>
  116. /// 管家所关联的课例数据
  117. /// </summary>
  118. /// <param name="jsonElement"></param>
  119. /// <returns></returns>
  120. [ProducesDefaultResponseType]
  121. [HttpPost("get-assiist")]
  122. public async Task<IActionResult> GetAssiist(JsonElement jsonElement)
  123. {
  124. try
  125. {
  126. if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
  127. jsonElement.TryGetProperty("site", out JsonElement site);
  128. var cosmosClient = _azureCosmos.GetCosmosClient();
  129. if ($"{site}".Equals(BIConst.GlobalSite))
  130. cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.GlobalSite);
  131. List<SchoolLen> schoolLens = new();
  132. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  133. foreach (var itemId in schoolIds)
  134. {
  135. School school = new();
  136. var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(itemId, new PartitionKey("Base"));
  137. if (response.Status == 200)
  138. {
  139. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  140. school = json.ToObject<School>();
  141. }
  142. SchoolLen schoolLen = new() { id = itemId, name = school != null ? school.name : itemId };
  143. string sqlTxt = $"SELECT COUNT(c.id) AS totals FROM c WHERE c.code='LessonRecord-{itemId}'";
  144. schoolLen.totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School" });
  145. schoolLens.Add(schoolLen);
  146. }
  147. return Ok(new { state = 200, schoolLens });
  148. }
  149. catch (Exception ex)
  150. {
  151. await _dingDing.SendBotMsg($"BI, {_option.Location} /lesson/get-assiist {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
  152. return BadRequest();
  153. }
  154. }
  155. /// <summary>
  156. /// 统计所有的课例数据
  157. /// </summary>
  158. /// <returns></returns>
  159. [HttpPost("get-diccount")]
  160. public async Task<IActionResult> GetDicCount(JsonElement jsonElement)
  161. {
  162. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  163. jsonElement.TryGetProperty("site", out JsonElement site);
  164. var cosmosClient = _azureCosmos.GetCosmosClient();
  165. if ($"{site}".Equals(BIConst.GlobalSite))
  166. cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.GlobalSite);
  167. if (!string.IsNullOrEmpty($"{tmdId}"))
  168. {
  169. jsonElement.TryGetProperty("years", out JsonElement _years);
  170. int years = DateTime.UtcNow.Year;
  171. if (!string.IsNullOrEmpty($"{_years}"))
  172. {
  173. years = _years.GetInt32();
  174. }
  175. List<SchoolLen> schoolLens = new();
  176. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  177. foreach (string schoolId in schoolIds)
  178. {
  179. School school = new();
  180. var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  181. if (response.Status == 200)
  182. {
  183. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  184. school = json.ToObject<School>();
  185. }
  186. SchoolLen schoolLen = new() { id = schoolId, name = school != null ? school.name : schoolId };
  187. List<List<double>> begin = new();
  188. await foreach (var lcount in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<LessonCount>(queryText: "select value(c) from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{schoolId}-{years}") }))
  189. {
  190. begin.Add(lcount.beginCount);
  191. }
  192. schoolLen.totals = (long)DenseMatrix.OfColumns(begin).ColumnSums().Sum();
  193. schoolLens.Add(schoolLen);
  194. }
  195. return Ok(new { state = 200, schoolLens });
  196. }
  197. else
  198. {
  199. List<List<double>> begin = new();
  200. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<LessonCount>(queryText: "select value(c) from c where c.pk='LessonCount'", requestOptions: new QueryRequestOptions() { }))
  201. {
  202. begin.Add(item.beginCount);
  203. }
  204. var count = DenseMatrix.OfColumns(begin).ColumnSums().Sum();
  205. return Ok(new { state = 200, count });
  206. }
  207. }
  208. /// <summary>
  209. /// 顾问关联的学校统计本学期的课例
  210. /// </summary>
  211. /// <param name="jsonElement"></param>
  212. /// <returns></returns>
  213. [HttpPost("get-termcount")]
  214. public async Task<IActionResult> GetTermCount(JsonElement jsonElement)
  215. {
  216. if (jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) BadRequest();
  217. jsonElement.TryGetProperty("site", out JsonElement site);
  218. var cosmosClient = _azureCosmos.GetCosmosClient();
  219. if ($"{site}".Equals(BIConst.GlobalSite))
  220. cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.GlobalSite);
  221. List<SchoolLen> schoolLens = new();
  222. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  223. foreach (var scid in schoolIds)
  224. {
  225. School school = new();
  226. var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(scid, new PartitionKey("Base"));
  227. if (response.Status == 200)
  228. {
  229. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  230. school = json.ToObject<School>();
  231. }
  232. SchoolLen schoolLen = new() { id = scid, name = !string.IsNullOrEmpty(school.name) ? school.name : scid };
  233. DateTimeOffset dateTime = DateTimeOffset.UtcNow;
  234. int year = (dateTime.Month <= 8 && dateTime.Month >= 3) ? dateTime.Year : dateTime.Year - 1;
  235. long stime = DateTimeOffset.Parse($"{year}-9-1").ToUnixTimeMilliseconds();
  236. //long etime = DateTimeOffset.Parse($"{year}-2-{((year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? 29 : 28)}").ToUnixTimeMilliseconds();
  237. double totals = 0;
  238. var syear = DateTimeOffset.FromUnixTimeMilliseconds(stime).Year;
  239. var tyear = DateTimeOffset.UtcNow.Year;
  240. var tday = DateTimeOffset.UtcNow.DayOfYear;
  241. //今年多少天
  242. int tdays = (tyear % 4 == 0 && tyear % 100 != 0 || tyear % 400 == 0) ? 366 : 365;
  243. //去年多少天
  244. int pydays = (syear % 4 == 0 && syear % 100 != 0 || syear % 400 == 0) ? 366 : 365;
  245. List<LessonCount> scount = new();
  246. List<LessonCount> tcount = new();
  247. DenseMatrix dense = null;
  248. var queryClass = $"select value(c) from c ";
  249. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonCount>(queryText: queryClass, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{scid}-{syear}") }))
  250. {
  251. scount.Add(item);
  252. }
  253. if (tyear > syear)
  254. {
  255. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonCount>(queryText: queryClass, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{scid}-{tyear}") }))
  256. {
  257. tcount.Add(item);
  258. }
  259. if (tcount.Count > 0)
  260. {
  261. List<List<double>> be = new();
  262. foreach (var item in tcount)
  263. {
  264. be.Add(item.beginCount);
  265. }
  266. dense = DenseMatrix.OfColumns(be);
  267. }
  268. }
  269. if (scount.Count > 0)
  270. {
  271. List<List<double>> begin = new();
  272. foreach (LessonCount lesson in scount)
  273. {
  274. begin.Add(lesson.beginCount);
  275. }
  276. var matrix = DenseMatrix.OfColumns(begin);
  277. //求本学期
  278. var sdays = DateTimeOffset.FromUnixTimeMilliseconds(stime).DayOfYear;
  279. if (tday - sdays < 0)
  280. {
  281. //var tmatrix = DenseMatrix.OfColumns(scount.beginCount);
  282. //跨年后开始到本学期结束
  283. double endMonth = 0;
  284. if (null != dense)
  285. {
  286. endMonth = dense.SubMatrix(0, tday, 0, dense.ColumnCount).ColumnSums().Sum();
  287. }
  288. var startMonth = matrix.SubMatrix(sdays - 1, pydays - sdays, 0, matrix.ColumnCount).ColumnSums().Sum();
  289. totals = (endMonth + startMonth);
  290. }
  291. else
  292. {
  293. var allMonth = matrix.SubMatrix(sdays - 1, tday - sdays + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
  294. totals = allMonth;
  295. }
  296. }
  297. schoolLen.totals = (long)totals;
  298. schoolLens.Add(schoolLen);
  299. }
  300. return Ok(new { state = 200, schoolLens });
  301. }
  302. /// <summary>
  303. /// 统计区级课例
  304. /// </summary>
  305. /// <param name="jsonElement"></param>
  306. /// <returns></returns>
  307. [ProducesDefaultResponseType]
  308. [HttpPost("get-areacount")]
  309. public async Task<IActionResult> GetAreaCount(JsonElement jsonElement)
  310. {
  311. if(!jsonElement.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
  312. jsonElement.TryGetProperty("site", out JsonElement site);
  313. List<string> schools = new();
  314. var cosmosClient = _azureCosmos.GetCosmosClient();
  315. if ($"{site}".Equals(BIConst.GlobalSite))
  316. cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.GlobalSite);
  317. StringBuilder scSqlTxt = new("select c.id from c");
  318. if (!string.IsNullOrEmpty($"{areaId}"))
  319. {
  320. scSqlTxt.Append($" where c.areaId='{areaId}'");
  321. }
  322. schools = await CommonFind.FindSchoolIds(cosmosClient, scSqlTxt.ToString(), "Base");
  323. //所有的课程记录
  324. List<LessonRecord> records = new();
  325. List<string> tecIds = new();
  326. foreach (var school in schools)
  327. {
  328. string sqlTxt = $"select value(c) from c where c.code='LessonRecord-{school}'";
  329. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonRecord>(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonRecord-{school}") }))
  330. {
  331. records.Add(item);
  332. }
  333. }
  334. tecIds = await CommonFind.FindRolesId(cosmosClient, schools);
  335. foreach (var tecId in tecIds)
  336. {
  337. string sqlTxt = $"select value(c) from c where c.id='{tecId}'";
  338. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<LessonRecord>(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonRecord") }))
  339. {
  340. records.Add(item);
  341. }
  342. }
  343. int dayCount = 0;
  344. var (dayStart, dayEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow);
  345. records.ForEach(x => { if (x.startTime >= dayStart && x.startTime <= dayEnd) dayCount += 1; });
  346. int weekCount = 0;
  347. var (weekStart, weekEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "week");
  348. records.ForEach(x => { if (x.startTime >= weekStart && x.startTime <= weekEnd) weekCount += 1; });
  349. int monthCount = 0;
  350. var (monthStart, monthEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "month");
  351. records.ForEach(x => { if (x.startTime >= monthStart && x.startTime <= monthEnd) monthCount += 1; });
  352. int termCount = 0;
  353. var (termStart, termEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "term");
  354. records.ForEach(x => { if (x.startTime >= termStart && x.startTime <= termEnd) termCount += 1; });
  355. double teachCount = records.Where(r => r.tmdid != null).Where((x, i) => records.FindIndex(z => z.tmdid == x.tmdid) == i).ToList().Count;
  356. return Ok(new { state = 200, lessonCount = records.Count, teachCount, dayCount, weekCount, monthCount, termCount });
  357. }
  358. /// <summary>
  359. /// 统计区级一年每周的课例数据趋势
  360. /// </summary>
  361. /// <param name="jsonElement"></param>
  362. /// <returns></returns>
  363. [ProducesDefaultResponseType]
  364. [HttpPost("get-weekcount")]
  365. public async Task<IActionResult> GetWeekCount(JsonElement jsonElement)
  366. {
  367. jsonElement.TryGetProperty("areaId", out JsonElement areaId);
  368. jsonElement.TryGetProperty("site", out JsonElement site);
  369. //Dictionary<int, double> weeks = new();
  370. List<double> weeks = new();
  371. var cosmosClient = _azureCosmos.GetCosmosClient();
  372. if ($"{site}".Equals(BIConst.GlobalSite))
  373. cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.GlobalSite);
  374. int year = DateTimeOffset.UtcNow.Year;
  375. int dayOfweek = (int)DateTimeOffset.Parse($"{year}-1-1").DayOfWeek;
  376. int currentTime = DateTimeOffset.UtcNow.DayOfYear / 7 + 1;
  377. int currentTime1 = DateTimeOffset.UtcNow.DayOfYear / 7;
  378. var sqlTxts = "select value(c) from c";
  379. List<LessonCount> scount = new();
  380. List<LessonCount> tcount = new();
  381. StringBuilder sqlTxt = new("select c.id from c");
  382. if (!string.IsNullOrEmpty($"{areaId}"))
  383. {
  384. sqlTxt.Append($" where c.areaId='{areaId}'");
  385. }
  386. List<string> schools = await CommonFind.FindSchoolIds(cosmosClient, sqlTxt.ToString(), "Base");
  387. foreach (var sId in schools)
  388. {
  389. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<LessonCount>(queryText:sqlTxts,requestOptions:new QueryRequestOptions() { PartitionKey =new PartitionKey($"LessonCount-{sId}-{year}")}))
  390. {
  391. scount.Add(item);
  392. }
  393. }
  394. List<string> teacIds = await CommonFind.FindRolesId(cosmosClient, schools);
  395. foreach (var tId in teacIds)
  396. {
  397. var sqlTxtt = $"select value(c) from c where c.id='{tId}'";
  398. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<LessonCount>(queryText: sqlTxtt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{year}") }))
  399. {
  400. tcount.Add(item);
  401. }
  402. }
  403. int days = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 366 : days = 365;
  404. List<List<double>> lessons = new();
  405. if (scount.Count > 0)
  406. {
  407. foreach (LessonCount item in scount)
  408. {
  409. lessons.Add(item.beginCount);
  410. }
  411. }
  412. if (tcount.Count > 0)
  413. {
  414. foreach (LessonCount item in tcount)
  415. {
  416. lessons.Add(item.beginCount);
  417. }
  418. }
  419. if (lessons.Count > 0)
  420. {
  421. var bmatrix = DenseMatrix.OfColumns(lessons);
  422. //开学第一周周内开课
  423. if (dayOfweek == 0)
  424. {
  425. dayOfweek = 7;
  426. }
  427. //第一周多少天
  428. var dd = 7 - dayOfweek + 1;
  429. //一年有几周
  430. int sweeks = days / 7;
  431. //查询天数
  432. int dayYear = 0;
  433. if (currentTime > 0)
  434. {
  435. for (int i = 0; i <= currentTime; i++)
  436. {
  437. if (i == 0)
  438. {
  439. var bsum = bmatrix.SubMatrix(dayYear, dd, 0, bmatrix.ColumnCount).ColumnSums().Sum();
  440. dayYear += dd;
  441. //weeks.Add(i, bsum);
  442. weeks.Add(bsum);
  443. }
  444. else
  445. {
  446. var bsum = bmatrix.SubMatrix(dayYear, 7, 0, bmatrix.ColumnCount).ColumnSums().Sum();
  447. dayYear += 7;
  448. //weeks.Add(i, bsum);
  449. weeks.Add(bsum);
  450. }
  451. }
  452. }
  453. //最后一周是否有余
  454. int stary = days - dayYear;
  455. if (stary > 0 && stary < 7)
  456. {
  457. var bsum = bmatrix.SubMatrix(dayYear, stary - 1, 0, bmatrix.ColumnCount).ColumnSums().Sum();
  458. //weeks.Add((sweeks + 1), bsum);
  459. weeks.Add(bsum);
  460. }
  461. }
  462. return Ok(new { state = 200, weeks });
  463. }
  464. /// <summary>
  465. /// 统计所有区级的课例和活动
  466. /// </summary>
  467. /// <returns></returns>
  468. [HttpPost("get-allarea")]
  469. public async Task<IActionResult> GetAllArea()
  470. {
  471. var cosmosClient = _azureCosmos.GetCosmosClient();
  472. List<AllAreaInfo> areaInfos = new();
  473. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Normal").GetItemQueryIterator<AllAreaInfo>(queryText: $"select c.id,c.name,c.standard,c.standardName from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base-Area") }))
  474. {
  475. areaInfos.Add(item);
  476. }
  477. foreach (var area in areaInfos)
  478. {
  479. List<string> schooId = await CommonFind.FindSchoolIds(cosmosClient,$"select c.id from c where c.areaId='{area.id}'","Base");
  480. List<string> tecId = await CommonFind.FindRolesId(cosmosClient, schooId);
  481. area.lessCount = await LessonStatisWay.GetAll(cosmosClient, schooId, tecId);
  482. area.activityCount = await ActivityWay.GetAll(cosmosClient, schooId, tecId);
  483. }
  484. return Ok(new { state = 200 , areaInfos });
  485. }
  486. /// <summary>
  487. /// 依据课例Id获取课例详情 数据管理工具——查询工具
  488. /// </summary>
  489. /// <param name="jsonElement"></param>
  490. /// <returns></returns>
  491. [HttpPost("get-info")]
  492. public async Task<IActionResult> GetInfo(JsonElement jsonElement)
  493. {
  494. if (!jsonElement.TryGetProperty("lessonId", out JsonElement lessonId)) return BadRequest();
  495. jsonElement.TryGetProperty("site", out JsonElement site);
  496. var cosmosClient = _azureCosmos.GetCosmosClient();
  497. if ($"{site}".Equals(BIConst.GlobalSite))
  498. cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.GlobalSite);
  499. List<object> lessons = new();
  500. string sqlTxt = $"select * from c where c.id='{lessonId}'";
  501. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
  502. {
  503. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  504. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  505. {
  506. lessons.Add(obj.ToObject<object>());
  507. }
  508. }
  509. return Ok(new { state = 200, lessons });
  510. }
  511. public record AllAreaInfo
  512. {
  513. public string id { get; set; }
  514. public string name { get; set; }
  515. public string standard { get; set; }
  516. public string standardName { get; set; }
  517. public int lessCount { get; set; }
  518. public int activityCount { get; set; }
  519. }
  520. public record SchoolLen
  521. {
  522. public string id { get; set; }
  523. public string name { get; set;}
  524. public long totals { get; set; }
  525. }
  526. }
  527. }