ProductStatisController.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  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.Json;
  9. using System.Threading.Tasks;
  10. using TEAMModelBI.Tool;
  11. using TEAMModelOS.Models;
  12. using TEAMModelOS.SDK.Context.BI;
  13. using TEAMModelOS.SDK.DI;
  14. using TEAMModelOS.SDK.Extension;
  15. using TEAMModelOS.SDK.Models;
  16. using TEAMModelOS.SDK.Models.Service.BI;
  17. namespace TEAMModelBI.Controllers.Census
  18. {
  19. [Route("product")]
  20. [ApiController]
  21. public class ProductStatisController : ControllerBase
  22. {
  23. //数据容器
  24. private readonly AzureCosmosFactory _azureCosmos;
  25. //钉钉提示信息
  26. private readonly DingDing _dingDing;
  27. private readonly Option _option;
  28. /// <summary>
  29. /// 软体产品
  30. /// </summary>
  31. private readonly Dictionary<string, string> _serials = new() { { "3222NIYD", "ezStation 2" }, { "J223IZ6M", "HiTeach STD" }, { "3222C6D2", "HiTeach TBL" }, { "J223IZAM", "HiTeach PRO" }, { "J2236ZCX", "HiTeach Lite" }, { "3222DNG2", "HiTeach Mobile" }, { "3222IAVN", "HiTeach Premium" }, { "BYJ6LZ6Z", "HiTeach5" } };
  32. /// <summary>
  33. /// 服务产品
  34. /// </summary>
  35. private readonly Dictionary<string, string> _services = new() { { "YMPCVCIM", "学情分析模组" }, { "IPDYZYLC", "智慧学校管理服务" }, { "3CLYJ6NP", "AClass ONE智慧学伴" }, { "IPALJ6NY", "数据储存服务空间" }, { "VABAJ6NV", "卷卡合一阅卷系统" } };
  36. public ProductStatisController(AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option)
  37. {
  38. _azureCosmos = azureCosmos;
  39. _dingDing = dingDing;
  40. _option = option?.Value;
  41. }
  42. /// <summary>
  43. /// 统计模组数量 已对接
  44. /// </summary>
  45. /// <returns></returns>
  46. [ProducesDefaultResponseType]
  47. [HttpPost("get-allcount")]
  48. public async Task<IActionResult> GetProductSum(JsonElement jsonElement)
  49. {
  50. //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
  51. var cosmosClient = _azureCosmos.GetCosmosClient();
  52. ////分开部署,就不需要,一站多用时,取消注释
  53. //if ($"{site}".Equals(BIConst.Global))
  54. // cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  55. List<ProductStatis> productStatis = new List<ProductStatis>();
  56. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIteratorSql(queryText: $"SELECT c.serial,c.service FROM c",requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("ProductSum") }))
  57. {
  58. using var json = await JsonDocument.ParseAsync(item.Content);
  59. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  60. {
  61. foreach (var itemCount in json.RootElement.GetProperty("Documents").EnumerateArray())
  62. {
  63. ////所有的产品
  64. //List<SchoolProductSumProdInfo> prodInfo = itemCount.GetProperty("prodinfo").ToObject<List<SchoolProductSumProdInfo>>();
  65. //foreach (var tempProdInfo in prodInfo)
  66. //{
  67. // ProductStatis tempPerod = productStatis.Find(x => x.prodCode.Equals(tempProdInfo.prodCode));
  68. // if (!string.IsNullOrEmpty($"{tempPerod}"))
  69. // {
  70. // tempPerod.Count += 1;
  71. // }
  72. // else
  73. // {
  74. // ProductStatis tempProd = new ProductStatis()
  75. // {
  76. // prodCode = tempProdInfo.prodCode,
  77. // prodName = tempProdInfo.prodName,
  78. // //dataType = tempProdInfo.dataType,
  79. // Count = 1,
  80. // };
  81. // productStatis.Add(tempProd);
  82. // }
  83. //}
  84. //软体产品
  85. List<SchoolProductSumData> tempSerials = itemCount.GetProperty("serial").ToObject<List<SchoolProductSumData>>();
  86. foreach (var serial in tempSerials)
  87. {
  88. ProductStatis tempPerod = productStatis.Find(x => x.prodCode.Equals(serial.prodCode));
  89. if (!string.IsNullOrEmpty($"{tempPerod}"))
  90. {
  91. tempPerod.Count += 1;
  92. }
  93. else
  94. {
  95. ProductStatis tempProd = new ProductStatis()
  96. {
  97. prodCode = serial.prodCode,
  98. prodName = _serials[serial.prodCode],
  99. //dataType = "",
  100. Count = 1,
  101. };
  102. productStatis.Add(tempProd);
  103. }
  104. }
  105. //服务产品
  106. List<SchoolProductSumData> service = itemCount.GetProperty("service").ToObject<List<SchoolProductSumData>>();
  107. foreach (var ser in service)
  108. {
  109. ProductStatis tempPerod = productStatis.Find(x => x.prodCode.Equals(ser.prodCode));
  110. if (!string.IsNullOrEmpty($"{tempPerod}"))
  111. {
  112. tempPerod.Count += 1;
  113. }
  114. else
  115. {
  116. ProductStatis tempProd = new ProductStatis()
  117. {
  118. prodCode = ser.prodCode,
  119. prodName = _services[ser.prodCode],
  120. //dataType = "",
  121. Count = 1,
  122. };
  123. productStatis.Add(tempProd);
  124. }
  125. }
  126. }
  127. }
  128. //if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  129. //{
  130. // var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  131. // while (accounts.MoveNext())
  132. // {
  133. // JsonElement account = accounts.Current;
  134. // List<SchoolProductSumProdInfo> prodInfo = account.GetProperty("prodinfo").ToObject<List<SchoolProductSumProdInfo>>();
  135. // foreach (var tempProdInfo in prodInfo)
  136. // {
  137. // ProductStatis tempPerod = productStatis.Find(x => x.prodName.Equals(tempProdInfo.prodName));
  138. // if (!string.IsNullOrEmpty($"{tempPerod}"))
  139. // {
  140. // tempPerod.Count += 1;
  141. // }
  142. // else
  143. // {
  144. // ProductStatis tempProd = new ProductStatis()
  145. // {
  146. // prodCode = tempProdInfo.prodCode,
  147. // prodName = tempProdInfo.prodName,
  148. // dataType = tempProdInfo.dataType,
  149. // Count = 1,
  150. // };
  151. // productStatis.Add(tempProd);
  152. // }
  153. // }
  154. // }
  155. //}
  156. }
  157. return Ok(new { state = 200, productStatis });
  158. }
  159. /// <summary>
  160. /// 依据学校ID查询产品信息 //已对接
  161. /// </summary>
  162. /// <param name="jsonElement"></param>
  163. /// <returns></returns>
  164. [ProducesDefaultResponseType]
  165. [HttpPost("get-school")]
  166. public async Task<IActionResult> GetSchoolSum(JsonElement jsonElement)
  167. {
  168. if (!jsonElement.TryGetProperty("schoolCode", out JsonElement schoolCode)) return BadRequest();
  169. //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
  170. var clientContainer = _azureCosmos.GetCosmosClient();
  171. ////分开部署,就不需要,一站多用时,取消注释
  172. //if ($"{site}".Equals(BIConst.Global))
  173. // clientContainer = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  174. List<SchoolProductSerial> serials = new(); //软体
  175. List<SchoolProductService> services = new(); //服务
  176. List<SchoolProductHard> hards = new(); //硬体
  177. SchoolProductSum productSum = new(); //产品状态
  178. List<SchoolProductSumProdInfo> prodinfo = new(); //学校的产品信息
  179. List<SchoolProductSumData> serialRecord = new(); //软体购买记录
  180. List<SchoolProductSumDataService> serviceRecord = new(); //服务购买记录
  181. List<SchoolProductSumDataHard> hardRecord = new(); //硬体购买记录
  182. //取产品的数量
  183. var response = await clientContainer.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolCode.ToString(), new PartitionKey($"ProductSum"));
  184. if (response.StatusCode == System.Net.HttpStatusCode.OK)
  185. {
  186. using var json = await JsonDocument.ParseAsync(response.Content);
  187. productSum = json.ToObject<SchoolProductSum>();
  188. prodinfo = productSum.prodinfo;
  189. serialRecord = productSum.serial;
  190. serviceRecord = productSum.service;
  191. hardRecord = productSum.hard;
  192. }
  193. //软体
  194. await foreach (var item in clientContainer.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIteratorSql(queryText: "SELECT * FROM c WHERE c.dataType='serial'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Product-{schoolCode}") }))
  195. {
  196. using var json = await JsonDocument.ParseAsync(item.Content);
  197. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  198. {
  199. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  200. {
  201. serials.Add(obj.ToObject<SchoolProductSerial>());
  202. }
  203. }
  204. }
  205. //服务
  206. await foreach (var item in clientContainer.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIteratorSql(queryText: "SELECT * FROM c WHERE c.dataType='service'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Product-{schoolCode}") }))
  207. {
  208. using var json = await JsonDocument.ParseAsync(item.Content);
  209. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  210. {
  211. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  212. {
  213. services.Add(obj.ToObject<SchoolProductService>());
  214. }
  215. }
  216. }
  217. //硬体
  218. await foreach (var item in clientContainer.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIteratorSql(queryText: "SELECT * FROM c WHERE c.dataType='hard'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Product-{schoolCode}") }))
  219. {
  220. using var json = await JsonDocument.ParseAsync(item.Content);
  221. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  222. {
  223. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  224. {
  225. hards.Add(obj.ToObject<SchoolProductHard>());
  226. }
  227. }
  228. }
  229. //学校教室
  230. List<Room> rooms = new();
  231. await foreach (var item in clientContainer.GetContainer("TEAMModelOS", "School").GetItemQueryIteratorSql<Room>(queryText: $"select value(c) from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Room-{schoolCode}") }))
  232. {
  233. rooms.Add(item);
  234. }
  235. return Ok(new { state = 200, serials, services, hards, productSum, rooms });
  236. }
  237. /// <summary>
  238. /// 顾问单个学校的模组
  239. /// </summary>
  240. /// <param name="jsonElement"></param>
  241. /// <returns></returns>
  242. [ProducesDefaultResponseType]
  243. [HttpPost("get-assistschool")]
  244. public async Task<IActionResult> GetAssistSchoolId(JsonElement jsonElement)
  245. {
  246. if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
  247. //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
  248. var cosmosClient = _azureCosmos.GetCosmosClient();
  249. ////分开部署,就不需要,一站多用时,取消注释
  250. //if ($"{site}".Equals(BIConst.Global))
  251. // cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  252. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  253. List<SchoolProduct> schoolProducts = new();
  254. foreach (var scid in schoolIds)
  255. {
  256. School school = new();
  257. var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(scid, new PartitionKey("Base"));
  258. if (response.StatusCode == System.Net.HttpStatusCode.OK)
  259. {
  260. using var json = await JsonDocument.ParseAsync(response.Content);
  261. school = json.ToObject<School>();
  262. }
  263. SchoolProduct sProduct = new() { id = scid, name = school != null ? school.name : scid };
  264. List<ProductStatis> productStatis = new();
  265. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIteratorSql(queryText: $"SELECT c.serial,c.service FROM c where c.id='{scid}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("ProductSum") }))
  266. {
  267. using var json = await JsonDocument.ParseAsync(item.Content);
  268. foreach (var itemCount in json.RootElement.GetProperty("Documents").EnumerateArray())
  269. {
  270. ////所有的产品信息
  271. //List<SchoolProductSumProdInfo> prodInfo = itemCount.GetProperty("prodinfo").ToObject<List<SchoolProductSumProdInfo>>();
  272. //foreach (var tempProdInfo in prodInfo)
  273. //{
  274. // ProductStatis tempPerod = productStatis.Find(x => x.prodCode.Equals(tempProdInfo.prodCode));
  275. // if (!string.IsNullOrEmpty($"{tempPerod}"))
  276. // {
  277. // tempPerod.Count += 1;
  278. // }
  279. // else
  280. // {
  281. // ProductStatis tempProd = new ProductStatis()
  282. // {
  283. // prodCode = tempProdInfo.prodCode,
  284. // prodName = tempProdInfo.prodName,
  285. // //dataType = tempProdInfo.dataType,
  286. // Count = 1,
  287. // };
  288. // productStatis.Add(tempProd);
  289. // }
  290. //}
  291. //软体产品
  292. List<SchoolProductSumData> tempSerials = itemCount.GetProperty("serial").ToObject<List<SchoolProductSumData>>();
  293. foreach (var serial in tempSerials)
  294. {
  295. ProductStatis tempPerod = productStatis.Find(x => x.prodCode.Equals(serial.prodCode));
  296. if (!string.IsNullOrEmpty($"{tempPerod}"))
  297. {
  298. tempPerod.Count += 1;
  299. }
  300. else
  301. {
  302. ProductStatis tempProd = new()
  303. {
  304. prodCode = serial.prodCode,
  305. prodName = _serials[serial.prodCode],
  306. //dataType = "",
  307. Count = 1,
  308. };
  309. productStatis.Add(tempProd);
  310. }
  311. }
  312. //服务产品
  313. List<SchoolProductSumData> service = itemCount.GetProperty("service").ToObject<List<SchoolProductSumData>>();
  314. foreach (var ser in service)
  315. {
  316. ProductStatis tempPerod = productStatis.Find(x => x.prodCode.Equals(ser.prodCode));
  317. if (!string.IsNullOrEmpty($"{tempPerod}"))
  318. {
  319. tempPerod.Count += 1;
  320. }
  321. else
  322. {
  323. ProductStatis tempProd = new()
  324. {
  325. prodCode = ser.prodCode,
  326. prodName = _services[ser.prodCode],
  327. //dataType = "",
  328. Count = 1,
  329. };
  330. productStatis.Add(tempProd);
  331. }
  332. }
  333. }
  334. }
  335. sProduct.product = productStatis;
  336. schoolProducts.Add(sProduct);
  337. }
  338. return Ok(new { state = 200, schoolProducts }) ;
  339. }
  340. /// <summary>
  341. /// 所有模组统计
  342. /// </summary>
  343. /// <returns></returns>
  344. [ProducesDefaultResponseType]
  345. [HttpPost("get-moduleanalys")]
  346. public async Task<IActionResult> GetModuleAnalys(JsonElement jsonElement)
  347. {
  348. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  349. //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
  350. var cosmosClient = _azureCosmos.GetCosmosClient();
  351. ////分开部署,就不需要,一站多用时,取消注释
  352. //if ($"{site}".Equals(BIConst.Global))
  353. // cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  354. long buyServiceCount = 0; //所有购买服务数量
  355. long buySerialsCount = 0; //所有购买软体数量
  356. long lastYearServiceCount = 0; //去年购买服务数量
  357. long yearServiceCount = 0; //今年购买服务数量
  358. long lastYearSerialsCount = 0; //去年购买软体数量
  359. long yearSerialsCount = 0; //今年购买软体数量
  360. var (lastYearStart, lastYearEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.Parse($"{DateTimeOffset.UtcNow.Year - 1}-1-1"), "year", false); //计算去年开始/结束时间
  361. var (yearStart, yearEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "year", false); //计算今年开始/结束时间
  362. if (!string.IsNullOrEmpty($"{tmdId}"))
  363. {
  364. List<RecSchoolAnalys> schoolAnalys = new();
  365. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  366. foreach (var scId in schoolIds)
  367. {
  368. //软体产品
  369. List<SchoolProductSumData> Serials = new();
  370. //软体产品
  371. List<SchoolProductSumData> Services = new();
  372. School school = new();
  373. var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(scId, new PartitionKey("Base"));
  374. if (response.StatusCode == System.Net.HttpStatusCode.OK)
  375. {
  376. using var json = await JsonDocument.ParseAsync(response.Content);
  377. school = json.ToObject<School>();
  378. }
  379. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIteratorSql(queryText: $"SELECT c.serial,c.service FROM c where c.id='{scId}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("ProductSum") }))
  380. {
  381. using var json = await JsonDocument.ParseAsync(item.Content);
  382. foreach (var itemCount in json.RootElement.GetProperty("Documents").EnumerateArray())
  383. {
  384. //软体产品
  385. Serials.AddRange(itemCount.GetProperty("serial").ToObject<List<SchoolProductSumData>>().Where(x => x.avaliable > 0).ToList());
  386. //服务产品
  387. Services.AddRange(itemCount.GetProperty("service").ToObject<List<SchoolProductSumData>>().Where(x => x.avaliable > 0).ToList());
  388. }
  389. }
  390. long tempBuySerc = await CommonFind.GetSqlValueCount(cosmosClient, "School", "select value(count(c.id)) from c where c.dataType='service' and c.pk='Product'", $"Product-{scId}");
  391. long tempBuySeri = await CommonFind.GetSqlValueCount(cosmosClient, "School", "select value(count(c.id)) from c where c.dataType='serial' and c.pk='Product'", $"Product-{scId}");
  392. string sqlTxt = "select value(count(c.id)) from c where c.pk='Product' and c.dataType='{0}' and c.regDate>={1} and c.regDate<={2}";
  393. long tempLastYearSerc = await CommonFind.GetSqlValueCount(cosmosClient, "School", string.Format(sqlTxt, "service", lastYearStart, lastYearEnd), $"Product-{scId}"); //计算去年购买的服务数量
  394. long tempyearSerc = await CommonFind.GetSqlValueCount(cosmosClient, "School", string.Format(sqlTxt, "service", yearStart, yearEnd), $"Product-{scId}"); //今年购买的服务数量
  395. long tempLastYearSeri = await CommonFind.GetSqlValueCount(cosmosClient, "School", string.Format(sqlTxt, "serial", lastYearStart, lastYearEnd), $"Product-{scId}"); //计算去年购买的软体数量
  396. long tempYearSeri = await CommonFind.GetSqlValueCount(cosmosClient, "School", string.Format(sqlTxt, "serial", yearStart, yearEnd), $"Product-{scId}"); //今年购买的软体数量
  397. schoolAnalys.Add(new RecSchoolAnalys { id = school.id, name = school.name, picture = school.picture, size = school.size, scale = school.scale, buySerc = tempBuySerc, lastYearSerc = tempLastYearSerc, yearSerc = tempyearSerc, buySeri = tempBuySeri, lastYearSeri = tempLastYearSeri, yearSeri = tempYearSeri });
  398. lastYearServiceCount += tempLastYearSerc;
  399. yearServiceCount += tempyearSerc;
  400. buyServiceCount += tempBuySerc;
  401. lastYearSerialsCount += tempLastYearSeri;
  402. yearSerialsCount += tempYearSeri;
  403. buySerialsCount += tempBuySeri;
  404. }
  405. return Ok(new { state = 200, buyServiceCount, buySerialsCount, lastYearServiceCount, yearServiceCount, lastYearSerialsCount, yearSerialsCount, schoolAnalys });
  406. }
  407. else
  408. {
  409. //软体产品
  410. List<SchoolProductSumData> Serials = new();
  411. //软体产品
  412. List<SchoolProductSumData> Services = new();
  413. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIteratorSql(queryText: $"SELECT c.serial,c.service FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("ProductSum") }))
  414. {
  415. using var json = await JsonDocument.ParseAsync(item.Content);
  416. foreach (var itemCount in json.RootElement.GetProperty("Documents").EnumerateArray())
  417. {
  418. //软体产品
  419. Serials.AddRange(itemCount.GetProperty("serial").ToObject<List<SchoolProductSumData>>().Where(x => x.avaliable > 0).ToList());
  420. //服务产品
  421. Services.AddRange(itemCount.GetProperty("service").ToObject<List<SchoolProductSumData>>().Where(x => x.avaliable > 0).ToList());
  422. }
  423. }
  424. var serialsCout = Serials.GroupBy(kv => new { kv.prodCode }).Select(y => new { key = y.Key.prodCode, value = y.Count() }).ToList();
  425. var servicesCout = Services.GroupBy(kv => new { kv.prodCode }).Select(y => new { key = y.Key.prodCode, value = y.Count() }).ToList();
  426. string containers = "School";
  427. buyServiceCount = await CommonFind.GetSqlValueCount(cosmosClient, containers, "select value(count(c.id)) from c where c.dataType='service' and c.pk='Product'");
  428. buySerialsCount = await CommonFind.GetSqlValueCount(cosmosClient, containers, "select value(count(c.id)) from c where c.dataType='serial' and c.pk='Product'");
  429. string sqlTxt = "select count(c.id) as totals from c where c.pk='Product' and c.dataType='{0}' and c.regDate>={1} and c.regDate<={2}";
  430. lastYearServiceCount = await CommonFind.GetSqlValueCount(cosmosClient, containers, string.Format(sqlTxt, "service", lastYearStart, lastYearEnd)); //计算去年购买的服务数量
  431. yearServiceCount = await CommonFind.GetSqlValueCount(cosmosClient, containers, string.Format(sqlTxt, "service", yearStart, yearEnd)); //今年购买的服务数量
  432. lastYearSerialsCount = await CommonFind.GetSqlValueCount(cosmosClient, containers, string.Format(sqlTxt, "serial", lastYearStart, lastYearEnd)); //计算去年购买的软体数量
  433. yearSerialsCount = await CommonFind.GetSqlValueCount(cosmosClient, containers, string.Format(sqlTxt, "serial", yearStart, yearEnd)); //今年购买的软体数量
  434. return Ok(new { state = 200, buyServiceCount, buySerialsCount, lastYearServiceCount, yearServiceCount, lastYearSerialsCount, yearSerialsCount, serialsCout, servicesCout });
  435. }
  436. }
  437. /// <summary>
  438. /// 顾问关联的学校模组
  439. /// </summary>
  440. /// <param name="jsonElement"></param>
  441. /// <returns></returns>
  442. [ProducesDefaultResponseType]
  443. [HttpPost("get-adviserschool")]
  444. public async Task<IActionResult> GetAdviserSchool(JsonElement jsonElement)
  445. {
  446. if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
  447. //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
  448. var cosmosClient = _azureCosmos.GetCosmosClient();
  449. ////分开部署,就不需要,一站多用时,取消注释
  450. //if ($"{site}".Equals(BIConst.Global))
  451. // cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  452. long buyServiceCount = 0; //购买服务数量
  453. long buySerialsCount = 0; //购买软体数量
  454. long lastYearServiceCount = 0; //去年购买服务数量
  455. long yearServiceCount = 0; //今年购买服务数量
  456. long lastYearSerialsCount = 0; //去年购买软体数量
  457. long yearSerialsCount = 0; //今年购买软体数量
  458. List<RecSchoolAnalys> schoolAnalys = new();
  459. var (lastYearStart, lastYearEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.Parse($"{DateTimeOffset.UtcNow.Year - 1}-1-1"), "year", false); //计算去年开始/结束时间
  460. var (yearStart, yearEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "year", false); //计算今年开始/结束时间
  461. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  462. foreach (var scId in schoolIds)
  463. {
  464. //软体产品
  465. List<SchoolProductSumData> Serials = new();
  466. //软体产品
  467. List<SchoolProductSumData> Services = new();
  468. School school = new();
  469. var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(scId, new PartitionKey("Base"));
  470. if (response.StatusCode == System.Net.HttpStatusCode.OK)
  471. {
  472. using var json = await JsonDocument.ParseAsync(response.Content);
  473. school = json.ToObject<School>();
  474. }
  475. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIteratorSql(queryText: $"SELECT c.serial,c.service FROM c where c.id='{scId}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("ProductSum") }))
  476. {
  477. using var json = await JsonDocument.ParseAsync(item.Content);
  478. foreach (var itemCount in json.RootElement.GetProperty("Documents").EnumerateArray())
  479. {
  480. //软体产品
  481. Serials.AddRange(itemCount.GetProperty("serial").ToObject<List<SchoolProductSumData>>().Where(x => x.avaliable > 0).ToList());
  482. //服务产品
  483. Services.AddRange(itemCount.GetProperty("service").ToObject<List<SchoolProductSumData>>().Where(x => x.avaliable > 0).ToList());
  484. }
  485. }
  486. long tempBuySerc = await CommonFind.GetSqlValueCount(cosmosClient, "select value(count(c.id)) from c where c.dataType='service' and c.pk='Product'", "School", $"Product-{scId}");
  487. long tempBuySeri = await CommonFind.GetSqlValueCount(cosmosClient, "select value(count(c.id)) from c where c.dataType='serial' and c.pk='Product'", "School", $"Product-{scId}");
  488. string sqlTxt = "select value(count(c.id)) from c where c.pk='Product' and c.dataType='{0}' and c.regDate>={1} and c.regDate<={2}";
  489. long tempLastYearSerc = await CommonFind.GetSqlValueCount(cosmosClient, "School", string.Format(sqlTxt, "service", lastYearStart, lastYearEnd), $"Product-{scId}"); //计算去年购买的服务数量
  490. long tempyearSerc = await CommonFind.GetSqlValueCount(cosmosClient, "School", string.Format(sqlTxt, "service", yearStart, yearEnd), $"Product-{scId}"); //今年购买的服务数量
  491. long tempLastYearSeri = await CommonFind.GetSqlValueCount(cosmosClient, "School", string.Format(sqlTxt, "serial", lastYearStart, lastYearEnd), $"Product-{scId}"); //计算去年购买的软体数量
  492. long tempYearSeri = await CommonFind.GetSqlValueCount(cosmosClient, "School", string.Format(sqlTxt, "serial", yearStart, yearEnd), $"Product-{scId}"); //今年购买的软体数量
  493. schoolAnalys.Add(new RecSchoolAnalys { id = school.id, name = school.name, picture = school.picture, size = school.size, scale = school.scale, buySerc = tempBuySerc, lastYearSerc = tempLastYearSerc, yearSerc = tempyearSerc, buySeri = tempBuySeri, lastYearSeri = tempLastYearSeri, yearSeri = tempYearSeri });
  494. lastYearServiceCount += tempLastYearSerc;
  495. yearServiceCount += tempyearSerc;
  496. buyServiceCount += tempBuySerc;
  497. lastYearSerialsCount += tempLastYearSeri;
  498. yearSerialsCount += tempYearSeri;
  499. buySerialsCount += tempBuySeri;
  500. }
  501. return Ok(new { state = 200, buyServiceCount, buySerialsCount, lastYearServiceCount, yearServiceCount, lastYearSerialsCount, yearSerialsCount, schoolAnalys });
  502. }
  503. /// <summary>
  504. /// 显示学校的模组分析
  505. /// </summary>
  506. public record RecSchoolAnalys
  507. {
  508. public string id { get; set; }
  509. public string name { get; set; }
  510. public string picture { get; set; }
  511. public int size { get; set; }
  512. public int scale { get; set; }
  513. public long buySerc { get; set; }
  514. public long lastYearSerc { get; set; }
  515. public long yearSerc { get; set; }
  516. public long buySeri { get; set; }
  517. public long lastYearSeri { get; set; }
  518. public long yearSeri { get; set; }
  519. }
  520. public record SchoolProduct
  521. {
  522. public string id { get; set; }
  523. public string name { get; set; }
  524. public List<ProductStatis> product { get; set; }
  525. }
  526. public record ProductStatis
  527. {
  528. public string prodCode { get; set; }
  529. public string prodName { get; set; }
  530. //public string dataType { get; set; }
  531. public long Count { get; set; }
  532. }
  533. }
  534. }