OnLineController.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. using Azure.Cosmos;
  2. using Azure.Storage.Blobs;
  3. using Azure.Storage.Blobs.Models;
  4. using Microsoft.AspNetCore.Http;
  5. using Microsoft.AspNetCore.Mvc;
  6. using StackExchange.Redis;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Data.SqlTypes;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Text.Json;
  14. using System.Threading.Tasks;
  15. using TEAMModelBI.Tool;
  16. using TEAMModelOS.SDK.Context.BI;
  17. using TEAMModelOS.SDK.Context.Constant;
  18. using TEAMModelOS.SDK.DI;
  19. using TEAMModelOS.SDK.Extension;
  20. using TEAMModelOS.SDK.Models;
  21. using TEAMModelOS.SDK.Models.Cosmos.BI;
  22. using TEAMModelOS.SDK.Models.Table;
  23. namespace TEAMModelBI.Controllers.BIHome
  24. {
  25. [Route("online")]
  26. [ApiController]
  27. public class OnLineController : ControllerBase
  28. {
  29. private readonly AzureCosmosFactory _azureCosmos;
  30. private readonly AzureStorageFactory _azureStorage;
  31. private readonly AzureRedisFactory _azureRedis;
  32. public OnLineController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis)
  33. {
  34. _azureCosmos = azureCosmos;
  35. _azureStorage = azureStorage;
  36. _azureRedis = azureRedis;
  37. }
  38. /// <summary>
  39. /// 总数统计 //已对接
  40. /// </summary>
  41. /// <returns></returns>
  42. [ProducesDefaultResponseType]
  43. [HttpPost("get-count")]
  44. public async Task<IActionResult> GetCount(JsonElement jsonElement)
  45. {
  46. var cosmosClient = _azureCosmos.GetCosmosClient();
  47. var table = _azureStorage.GetCloudTableClient().GetTableReference("IESLogin");
  48. var blobClient = _azureStorage.GetBlobContainerClient($"0-public");
  49. //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
  50. //if ($"{site}".Equals(BIConst.Global))
  51. //{
  52. // cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  53. // table = _azureStorage.GetCloudTableClient(BIConst.Global).GetTableReference("IESLogin");
  54. // blobClient = _azureStorage.GetBlobContainerClient($"0-public", BIConst.Global);
  55. //}
  56. DateTimeOffset dateTime = DateTimeOffset.UtcNow;
  57. string cDay = dateTime.ToString("yyyyMMdd");
  58. var (daySt, dayEt) = TimeHelper.GetStartOrEnd(dateTime); //今天开始时间 13位
  59. var (daySf, dayEf) = TimeHelper.GetStartOrEnd(dateTime, dateLenth: false); //今天开始时间 10位
  60. var (lastDayS, lastdayE) = TimeHelper.GetStartOrEnd(dateTime.AddDays(-1)); //昨天开始时间
  61. var near7S = dateTime.AddDays(-7).ToUnixTimeMilliseconds(); //前七天的开始时间
  62. var near7E = dateTime.ToUnixTimeMilliseconds(); //当前结束时间
  63. long hour1 = dateTime.AddHours(-1).ToUnixTimeMilliseconds(); //一小时前时间戳
  64. int areaCnt = 0; //学区总数
  65. int scCnt = 0; //学校总数
  66. int tchCnt = 0; //教师总数
  67. int stuCnt = 0; //学生总数
  68. int apiCnt = 0; //当天接口访问总量
  69. int onStuCnt = 0; //学生在线人数
  70. int onTchCnt = 0; //教师在线人数
  71. int todayScCnt = 0; //今日新增学校数
  72. int todayTchCnt = 0; //今日新增教师
  73. int todayStuCnt = 0; //今日新增学生数
  74. long datetime = dateTime.ToUnixTimeMilliseconds();
  75. string currentSql = "select value(count(c.id)) from c";
  76. areaCnt = await CommonFind.GetSqlValueCount(cosmosClient, "Normal", currentSql, "Base-Area");
  77. scCnt = await CommonFind.GetSqlValueCount(cosmosClient, "School", currentSql, "Base");
  78. tchCnt = await CommonFind.GetSqlValueCount(cosmosClient, "Teacher", currentSql, "Base");
  79. stuCnt = await CommonFind.GetSqlValueCount(cosmosClient, "Student", "select value(count(c.id)) from c where c.pk='Base'");
  80. string addSql = $"select value(count(c.id)) from c where c.createTime >={daySt} and c.createTime <= {dayEt}";
  81. todayScCnt = await CommonFind.GetSqlValueCount(cosmosClient, "School", addSql, "Base");
  82. todayTchCnt = await CommonFind.GetSqlValueCount(cosmosClient, "Teacher", addSql, "Base");
  83. todayStuCnt = await CommonFind.GetSqlValueCount(cosmosClient, "Student", addSql, "Base");
  84. string onStuSql = $"select value(count(c.id)) from c join t in c.loginInfos where array_length(c.loginInfos) > 0 and t.expire > {hour1} and c.pk='Base'";
  85. onTchCnt = await CommonFind.GetSqlValueCount(cosmosClient, "Teacher", onStuSql);
  86. onStuCnt = await CommonFind.GetSqlValueCount(cosmosClient, "Student", onStuSql);
  87. //接口访问量
  88. List<RecCnt> recCnts = new();
  89. await foreach (BlobItem blobItem in blobClient.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"visitCnt/{cDay}"))
  90. {
  91. if (blobItem.Name.EndsWith(".json") && !blobItem.Name.EndsWith("/days.json"))
  92. {
  93. BlobClient tempBlobClient = blobClient.GetBlobClient(blobItem.Name);
  94. if (await tempBlobClient.ExistsAsync())
  95. {
  96. using (var meomoryStream = new MemoryStream())
  97. {
  98. var response = blobClient.GetBlobClient($"{blobItem.Name}").DownloadTo(meomoryStream);
  99. RecCnt recCnt = Encoding.UTF8.GetString(meomoryStream.ToArray()).ToString().ToObject<RecCnt>();
  100. recCnts.Add(recCnt);
  101. }
  102. }
  103. }
  104. }
  105. apiCnt = recCnts.Select(x => x.apiCnt.Select(s => s.count).Sum()).Sum();
  106. string yymmss = TimeHelper.GetDateTime(datetime).ToString();
  107. return Ok(new { state = 200, yymmss, datetime, areaCnt, scCnt, tchCnt, stuCnt, todayScCnt, todayTchCnt, todayStuCnt, onStuCnt, onTchCnt, apiCnt });
  108. }
  109. /// <summary>
  110. /// 在线人数趋势图 //已对接
  111. /// </summary>
  112. /// <returns></returns>
  113. [ProducesDefaultResponseType]
  114. [HttpPost("get-trend")]
  115. public async Task<IActionResult> GetTrend(JsonElement jsonElement)
  116. {
  117. var table = _azureStorage.GetCloudTableClient().GetTableReference("IESLogin");
  118. var redisClinet = _azureRedis.GetRedisClient(8);
  119. //jsonElement.TryGetProperty("site", out JsonElement site); //分开部署,就不需要,一站多用时,取消注释
  120. //if ($"{site}".Equals(BIConst.Global))
  121. //{
  122. // table = _azureStorage.GetCloudTableClient(BIConst.Global).GetTableReference("IESLogin");
  123. // redisClinet = _azureRedis.GetRedisClient(dbnum: 8, name: BIConst.Global);
  124. //}
  125. DateTimeOffset dateTime = DateTimeOffset.UtcNow;
  126. var (daySt, dayEt) = TimeHelper.GetStartOrEnd(dateTime); //今天开始时间 13位
  127. var (strDaySt, strDayEt) = TimeHelper.GetUnixToDate(daySt, dayEt, "yyyyMMddHH");
  128. var dateDay = dateTime.ToString("yyyyMMdd"); //获取当天的日期
  129. //daySt.ToString("yyyyMMddHH");
  130. Dictionary<long, int> allDays = new(); //所有在线人数
  131. Dictionary<long, int> tchDays = new(); //教师在线人数
  132. Dictionary<long, int> stuDays = new(); //学生在线人数
  133. Dictionary<long, int> tmdDays = new(); //醍摩豆账户学生
  134. SortedSetEntry[] tchDay = redisClinet.SortedSetRangeByScoreWithScores($"Login:IES:teacher:{dateDay}");
  135. if (tchDay.Length > 0)
  136. {
  137. foreach (var item in tchDay)
  138. {
  139. int val = ((int)item.Score);
  140. int key = ((int)item.Element);
  141. //var utcTo = new DateTimeOffset(new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, key, 0, 0)).Hour;
  142. //var hour = int.Parse(DateTime.SpecifyKind(Convert.ToDateTime($"{dateTime.Year}/{dateTime.Month}/{ dateTime.Day} {key}:00:00"), DateTimeKind.Utc).ToLocalTime().ToString("HH"));
  143. tchDays.Add(key, val);
  144. if (allDays.ContainsKey(key))
  145. allDays[key] = (allDays[key] + val);
  146. else
  147. allDays.Add(key, val);
  148. }
  149. }
  150. else
  151. {
  152. string tableSqlTch = $"PartitionKey eq 'HourLogin' and RowKey ge '{strDaySt}' and RowKey le '{strDayEt}'";
  153. List<HourLogin> hourLoginsTch = await table.QueryWhereString<HourLogin>(tableSqlTch);
  154. if (hourLoginsTch.Count > 0)
  155. {
  156. foreach (var item in hourLoginsTch)
  157. {
  158. await redisClinet.SortedSetIncrementAsync($"Login:IES:teacher:{dateDay}", $"{item.Hour}", item.Teacher);//存一天24小时
  159. tchDays.Add(item.Hour, item.Teacher);
  160. if (allDays.ContainsKey(item.Hour))
  161. allDays[item.Hour] = (allDays[item.Hour] + item.Teacher);
  162. else
  163. allDays.Add(item.Hour, item.Teacher);
  164. }
  165. }
  166. }
  167. SortedSetEntry[] stuDay = redisClinet.SortedSetRangeByScoreWithScores($"Login:IES:student:{dateDay}");
  168. if (stuDay.Length > 0)
  169. {
  170. foreach (var item in stuDay)
  171. {
  172. int val = (int)item.Score;
  173. int key = (int)item.Element;
  174. stuDays.Add(key, val);
  175. if (allDays.ContainsKey(key))
  176. allDays[key] = (allDays[key] + val);
  177. else
  178. allDays.Add(key, val);
  179. }
  180. }
  181. else
  182. {
  183. string tableSqlStu = $"PartitionKey eq 'HourLogin' and RowKey ge '{strDaySt}' and RowKey le '{strDayEt}'";
  184. List<HourLogin> hourLoginsStu = await table.QueryWhereString<HourLogin>(tableSqlStu);
  185. //var hourStuCnt = hourLoginsStu.GroupBy(x => x.Hour).Select(k => new { key = int.Parse(k.Key.ToString().Substring(8, 2)), value = k.Count() }).ToList();
  186. if (hourLoginsStu.Count > 0)
  187. {
  188. foreach (var item in hourLoginsStu)
  189. {
  190. await redisClinet.SortedSetIncrementAsync($"Login:IES:student:{dateDay}", $"{item.Hour}", item.Student);//存一天24小时
  191. stuDays.Add(item.Hour, item.Student);
  192. if (allDays.ContainsKey(item.Hour))
  193. allDays[item.Hour] = (allDays[item.Hour] + item.Student);
  194. else
  195. allDays.Add(item.Hour, item.Student);
  196. }
  197. }
  198. }
  199. SortedSetEntry[] tmdDay = redisClinet.SortedSetRangeByScoreWithScores($"Login:IES:tmduser:{dateDay}");
  200. if (tmdDay.Length > 0)
  201. {
  202. foreach (var item in tmdDay)
  203. {
  204. int val = (int)item.Score;
  205. int key = (int)item.Element;
  206. tmdDays.Add(key, val);
  207. if (allDays.ContainsKey(key))
  208. allDays[key] = (allDays[key] + val);
  209. else
  210. allDays.Add(key, val);
  211. }
  212. }
  213. else
  214. {
  215. string tableSqlTmd = $"PartitionKey eq 'HourLogin' and RowKey ge '{strDaySt}' and RowKey le '{strDayEt}'";
  216. List<HourLogin> hourLoginsTmd = await table.QueryWhereString<HourLogin>(tableSqlTmd);
  217. //var hourTmdCnt = hourLoginsTmd.GroupBy(x => x.Hour).Select(k => new { key = int.Parse(k.Key.ToString().Substring(8, 2)), value = k.Count() }).ToList();
  218. if (hourLoginsTmd.Count > 0)
  219. {
  220. foreach (var item in hourLoginsTmd)
  221. {
  222. await redisClinet.SortedSetIncrementAsync($"Login:IES:tmduser:{dateDay}", $"{item.Hour}", item.TmdUser);//存一天24小时
  223. var utcTo = new DateTimeOffset(new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, item.Hour, 00, 00)).Hour;
  224. tmdDays.Add(utcTo, item.TmdUser);
  225. if (allDays.ContainsKey(utcTo))
  226. allDays[utcTo] = (allDays[utcTo] + item.TmdUser);
  227. else
  228. allDays.Add(utcTo, item.TmdUser);
  229. }
  230. }
  231. }
  232. return Ok(new { state = 200,allDays = allDays.OrderBy(o=>o.Key).ToList(), tchDays=tchDays.OrderBy(o => o.Key).ToList(), stuDays= stuDays.OrderBy(o => o.Key).ToList(), tmdDays= tmdDays.OrderBy(o => o.Key).ToList() });
  233. }
  234. /// <summary>
  235. /// 课例趋势图 //已对接
  236. /// </summary>
  237. /// <returns></returns>
  238. [ProducesDefaultResponseType]
  239. [HttpPost("get-lessontrend")]
  240. public async Task<IActionResult> GetLessonTrend(JsonElement jsonElement)
  241. {
  242. DateTimeOffset dateTime = DateTimeOffset.UtcNow;
  243. var cosmosClient = _azureCosmos.GetCosmosClient();
  244. //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
  245. //if ($"{site}".Equals(BIConst.Global))
  246. // cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  247. int year = dateTime.Year; //当前年
  248. int month = dateTime.Month; //当前月
  249. int day = dateTime.Day; //当天
  250. var lestDate = dateTime.AddDays(-1); //昨天
  251. int hour = int.Parse(DateTime.SpecifyKind(Convert.ToDateTime($"{dateTime.Year}/{dateTime.Month}/{ dateTime.Day} {dateTime.Hour}:00:00"), DateTimeKind.Utc).ToLocalTime().ToString("HH")); //当前小时
  252. var (daySt, dayEt) = TimeHelper.GetStartOrEnd(dateTime); //今天开始时间 13位
  253. var (lastDayS, lastdayE) = TimeHelper.GetStartOrEnd(lestDate); //昨天开始时间
  254. var (monthDayS, monthDayE) = TimeHelper.GetStartOrEnd(lestDate, "monthDay"); //本月开始/结束时间
  255. var (yearS, yearE) = TimeHelper.GetStartOrEnd(lestDate, "yearMonth"); //本月开始/结束时间
  256. Dictionary<int, int> sdOpenLesn = new(); //今日开课
  257. Dictionary<int, int> sdUpdLesn = new(); //今日上传课例
  258. Dictionary<int, int> ydOpenLesn = new(); //昨日开课
  259. Dictionary<int, int> ydUpdLesn = new(); //昨日上传课例
  260. Dictionary<int, int> mthOpenLesn = new(); //本月开课
  261. Dictionary<int, int> mthUpdLesn = new(); //本月上传课例
  262. Dictionary<int, int> yrOpenLesn = new(); //本年开课
  263. Dictionary<int, int> yrUpdLesn = new(); //本年上传课例
  264. Dictionary<int, int> allOpenLesn = new(); //所有年开课
  265. Dictionary<int, int> allUpdLesn = new(); //所有年上传课例
  266. List<RecLesn> yearLeson = new();
  267. List<RecLesn> allLess = new();
  268. string allSql = "select c.id,c.name,c.code,c.school,c.scope,c.startTime from c where c.pk='LessonRecord'";
  269. //所有的课例
  270. allLess = await CommonFind.GetObject<RecLesn>(cosmosClient, new List<string>() { "School", "Teacher" }, allSql);
  271. if (allLess.Count > 0)
  272. {
  273. for (int i = 0; i < 24; i++)
  274. {
  275. if (hour >= i)
  276. {
  277. DateTimeOffset timeHour = new DateTime(year, month, day, i, 0, 0);
  278. var (hourS, hourE) = TimeHelper.GetStartOrEnd(timeHour, type: "hour");
  279. var openLesn1 = allLess.Where(item => item.startTime >= hourS && item.startTime <= hourE && item.upload == 0).Count();
  280. var openLesn = allLess.Where(item => item.startTime >= hourS && item.startTime <= hourE && item.upload == 0).ToList();
  281. sdOpenLesn.Add(i, openLesn.Count());
  282. var UpdLesn = allLess.Where(item => item.startTime >= hourS && item.startTime <= hourE && item.upload == 1).ToList();
  283. sdUpdLesn.Add(i, UpdLesn.Count());
  284. }
  285. DateTimeOffset yesterday = new DateTime(lestDate.Year, lestDate.Month, lestDate.Day, i, 0, 0);
  286. var (yHourS, yHourE) = TimeHelper.GetStartOrEnd(yesterday, type: "hour");
  287. var yOpenLesn = allLess.Where(item => item.startTime >= yHourS && item.startTime <= yHourE && item.upload == 0).ToList();
  288. ydOpenLesn.Add(i, yOpenLesn.Count);
  289. var yUpdLesn = allLess.Where(item => item.startTime >= yHourS && item.startTime <= yHourE && item.upload == 1).ToList();
  290. ydUpdLesn.Add(i, yUpdLesn.Count);
  291. }
  292. for (int i = 1; i <= day; i++)
  293. {
  294. DateTimeOffset timeDay = new DateTime(year, month, i, 0, 0, 0);
  295. var (dayS, dayE) = TimeHelper.GetStartOrEnd(timeDay); //本月开始/结束时间
  296. var openLesn = allLess.Where(item => item.startTime >= dayS && item.startTime <= dayE && item.upload == 0).ToList();
  297. mthOpenLesn.Add(i, openLesn.Count());
  298. var UpdLesn = allLess.Where(item => item.startTime >= dayS && item.startTime <= dayE && item.upload == 1).ToList();
  299. mthUpdLesn.Add(i, UpdLesn.Count());
  300. }
  301. for (int i = 1; i <= month; i++)
  302. {
  303. DateTimeOffset timeDay = DateTimeOffset.UtcNow;
  304. if (i == 2)
  305. {
  306. int tempDay = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? tempDay = 29 : tempDay = 28;
  307. timeDay = new DateTime(year, i, tempDay, 0, 0, 0);
  308. }
  309. var (monthS, monthE) = TimeHelper.GetStartOrEnd(timeDay, "month"); //本月开始/结束时间
  310. var openLesn = allLess.Where(item => item.startTime >= monthS && item.startTime <= monthE && item.upload == 0).ToList();
  311. yrOpenLesn.Add(i, openLesn.Count());
  312. var UpdLesn = allLess.Where(item => item.startTime >= monthS && item.startTime <= monthE && item.upload == 1).ToList();
  313. yrUpdLesn.Add(i, UpdLesn.Count());
  314. }
  315. yearLeson = allLess.Select(item => { item.startTime = TimeHelper.GetDateTime(item.startTime).Year; return item; }).ToList();
  316. List<RecLesn> oRecLess = yearLeson.Where(o => o.upload == 0).ToList();
  317. var allo = oRecLess.GroupBy(g => g.startTime).Select(s => new { key = s.Key, value = s.Count() }).ToList();
  318. if (allo.Count > 0)
  319. allo.ForEach(a => { allOpenLesn.Add((int)a.key, a.value); });
  320. List<RecLesn> uRecLesns = yearLeson.Where(o => o.upload == 1).ToList();
  321. var allu = uRecLesns.GroupBy(g => g.startTime).Select(s => new { key = s.Key, value = s.Count() }).ToList();
  322. if (allu.Count > 0)
  323. allu.ForEach(a => { allUpdLesn.Add((int)a.key, a.value); });
  324. }
  325. return Ok(new
  326. {
  327. state = RespondCode.Ok,
  328. hours = new { sdOpenLesn = sdOpenLesn.ToList(), sdUpdLesn = sdUpdLesn.ToList(), ydOpenLesn = ydOpenLesn.ToList(), ydUpdLesn = ydUpdLesn.ToList() },
  329. days = new { sdOpenLesn = mthOpenLesn.ToList(), sdUpdLesn = mthUpdLesn.ToList() },
  330. months = new { sdOpenLesn = yrOpenLesn.ToList(), sdUpdLesn = yrUpdLesn.ToList() },
  331. years = new { sdOpenLesn = allOpenLesn.ToList(), sdUpdLesn = allUpdLesn.ToList() }
  332. }) ;
  333. }
  334. /// <summary>
  335. /// 版本数量占比 //已对接
  336. /// </summary>
  337. /// <returns></returns>
  338. [ProducesDefaultResponseType]
  339. [HttpPost("get-edition")]
  340. public async Task<IActionResult> GetEdition(JsonElement jsonElement)
  341. {
  342. var cosmosClient = _azureCosmos.GetCosmosClient();
  343. //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
  344. //if ($"{site}".Equals(BIConst.Global))
  345. // cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  346. int beCnt = 0; //基础班
  347. int seCnt = 0; //标准版
  348. int peCnt = 0; //专业版
  349. List<RecScEd> scEdCnt = new();
  350. var ScSql = $"select c.id,c.name,c.size,c.scale from c";
  351. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<RecScEd>(queryText: ScSql, requestOptions:new QueryRequestOptions() { PartitionKey= new PartitionKey("Base")}))
  352. {
  353. scEdCnt.Add(item);
  354. }
  355. //scEdCnt.ForEach(async scProCnt =>
  356. //{
  357. // var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(scProCnt.id, new PartitionKey("ProductSum"));
  358. // if (response.Status == 200)
  359. // {
  360. // using var json = await JsonDocument.ParseAsync(response.ContentStream);
  361. // SchoolProductSum ScProductSum = json.ToObject<SchoolProductSum>();
  362. // //scProCnt.serial = ScProductSum.serial.Count();
  363. // //scProCnt.service = ScProductSum.service.Count();
  364. // //scProCnt.hard = ScProductSum.hard.Count();
  365. // List<string> pSeriCnt = ScProductSum.serial.Select(s=> s.prodCode).ToList();
  366. // List<string> pServCnt = ScProductSum.service.Select(s=>s.prodCode).ToList();
  367. // List<string> pHardCnt = ScProductSum.hard.Select(s=>s.prodCode).ToList();
  368. // scProCnt.serial = pSeriCnt;
  369. // scProCnt.service = pServCnt;
  370. // scProCnt.hard = pHardCnt;
  371. // if (scProCnt.scale >= 500 && (pSeriCnt.Count > 0 || pServCnt.Count > 0 || pHardCnt.Count > 0)) peCnt += 1;
  372. // }
  373. // if (scProCnt.scale >= 500 && scProCnt.serial.Count == 0 && scProCnt.service.Count == 0 && scProCnt.hard.Count == 0) seCnt += 1;
  374. // if (scProCnt.scale == 0) beCnt += 1;
  375. //});
  376. foreach (var item in scEdCnt)
  377. {
  378. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(item.id, new PartitionKey("ProductSum"));
  379. if (response.Status == 200)
  380. {
  381. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  382. SchoolProductSum ScProductSum = json.ToObject<SchoolProductSum>();
  383. //scProCnt.serial = ScProductSum.serial.Count();
  384. //scProCnt.service = ScProductSum.service.Count();
  385. //scProCnt.hard = ScProductSum.hard.Count();
  386. List<string> pSeriCnt = ScProductSum.serial.Select(s => s.prodCode).ToList();
  387. List<string> pServCnt = ScProductSum.service.Select(s => s.prodCode).ToList();
  388. List<string> pHardCnt = ScProductSum.hard.Select(s => s.prodCode).ToList();
  389. item.serial = pSeriCnt;
  390. item.service = pServCnt;
  391. item.hard = pHardCnt;
  392. if (item.scale >= 500 && (pSeriCnt.Count > 0 || pServCnt.Count > 0 || pHardCnt.Count > 0)) peCnt += 1;
  393. }
  394. if (item.scale >= 500 && item.serial.Count == 0 && item.service.Count == 0 && item.hard.Count == 0) seCnt += 1;
  395. if (item.scale == 0) beCnt += 1;
  396. }
  397. return Ok(new { state = 200, beCnt, seCnt, peCnt, scEdCnt });
  398. }
  399. /// <summary>
  400. /// 记录学校版本信息
  401. /// </summary>
  402. public record RecScEd
  403. {
  404. public string id { get; set; }
  405. public string name { get; set; }
  406. public int size { get; set; }
  407. public int scale { get; set; }
  408. public List<string> serial { get; set; } = new List<string>();//软体
  409. public List<string> service { get; set; } = new List<string>(); //服务
  410. public List<string> hard { get; set; } = new List<string>(); //硬体
  411. }
  412. /// <summary>
  413. /// 记录课例
  414. /// </summary>
  415. public record RecLesn
  416. {
  417. public string id { get; set; }
  418. public string name { get; set; }
  419. public string code { get; set; }
  420. public string school { get; set; }
  421. public string scope{get;set;}
  422. public long startTime { get; set; }
  423. public int upload { get; set; }
  424. }
  425. }
  426. }