|
@@ -0,0 +1,165 @@
|
|
|
+using Azure.Cosmos;
|
|
|
+using Azure.Storage.Blobs.Models;
|
|
|
+using Azure.Storage.Sas;
|
|
|
+using Microsoft.AspNetCore.Authorization;
|
|
|
+using Microsoft.AspNetCore.Http;
|
|
|
+using Microsoft.AspNetCore.Mvc;
|
|
|
+using Microsoft.Extensions.Options;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.IdentityModel.Tokens.Jwt;
|
|
|
+using System.IO;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using System.Text.Json;
|
|
|
+using System.Threading.Tasks;
|
|
|
+using TEAMModelOS.Models;
|
|
|
+using TEAMModelOS.Filter;
|
|
|
+using TEAMModelOS.SDK.DI;
|
|
|
+using TEAMModelOS.SDK.Extension;
|
|
|
+using Microsoft.Azure.Cosmos.Table;
|
|
|
+using TEAMModelOS.SDK.Models;
|
|
|
+
|
|
|
+namespace TEAMModelOS.Controllers.Client
|
|
|
+{
|
|
|
+ [ProducesResponseType(StatusCodes.Status200OK)]
|
|
|
+ [ProducesResponseType(StatusCodes.Status400BadRequest)]
|
|
|
+ [Route("habb")]
|
|
|
+ [ApiController]
|
|
|
+
|
|
|
+ public class HabbController : ControllerBase
|
|
|
+ {
|
|
|
+ private readonly AzureCosmosFactory _azureCosmos;
|
|
|
+ private readonly DingDing _dingDing;
|
|
|
+ private readonly Option _option;
|
|
|
+
|
|
|
+ public HabbController(
|
|
|
+ AzureCosmosFactory azureCosmos,
|
|
|
+ DingDing dingDing,
|
|
|
+ IOptionsSnapshot<Option> option)
|
|
|
+ {
|
|
|
+ _azureCosmos = azureCosmos;
|
|
|
+ _dingDing = dingDing;
|
|
|
+ _option = option?.Value;
|
|
|
+ }
|
|
|
+
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
+ [Authorize(Roles = "BB")]
|
|
|
+ [HttpPost("get-school-prod-service")]
|
|
|
+ public async Task<IActionResult> GetSchoolProd(JsonElement request)
|
|
|
+ {
|
|
|
+ //Debug
|
|
|
+ //string json = System.Text.Json.JsonSerializer.Serialize(id_token);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (!request.TryGetProperty("school_code", out JsonElement schoolCodeJson)) return BadRequest();
|
|
|
+ string schoolCode = schoolCodeJson.ToString();
|
|
|
+ if(string.IsNullOrWhiteSpace(schoolCode)) return BadRequest();
|
|
|
+
|
|
|
+ int err = 0;
|
|
|
+ string msg = string.Empty;
|
|
|
+ List<HabbServiceProd> prod = new List<HabbServiceProd>();
|
|
|
+
|
|
|
+ //取得學校基本資料
|
|
|
+ int schoolSize = 0;
|
|
|
+ var client = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School");
|
|
|
+ var responsesch = await client.ReadItemStreamAsync(schoolCode, new PartitionKey($"Base"));
|
|
|
+ if (responsesch.Status == 200)
|
|
|
+ {
|
|
|
+ var jsons = await JsonDocument.ParseAsync(responsesch.ContentStream);
|
|
|
+ if (jsons.RootElement.TryGetProperty("size", out JsonElement sizeJobj))
|
|
|
+ {
|
|
|
+ if(sizeJobj.TryGetInt32(out int sizeJobjInt))
|
|
|
+ {
|
|
|
+ schoolSize = sizeJobjInt;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else //無此學校資料
|
|
|
+ {
|
|
|
+ err = 1;
|
|
|
+ msg = "Invalid School code";
|
|
|
+ }
|
|
|
+
|
|
|
+ //取得各產品目前可得數量 (目前先只取服務,序號/硬體有需要再追加)
|
|
|
+ List<SchoolProductSumDataService> service = new List<SchoolProductSumDataService>();
|
|
|
+ var responseSchPdsm = await client.ReadItemStreamAsync(schoolCode, new PartitionKey($"ProductSum"));
|
|
|
+ if (responseSchPdsm.Status == 200)
|
|
|
+ {
|
|
|
+ using var json = await JsonDocument.ParseAsync(responseSchPdsm.ContentStream);
|
|
|
+ SchoolProductSum productSum = json.ToObject<SchoolProductSum>();
|
|
|
+ service = productSum.service;
|
|
|
+ //[特別規則]size替換
|
|
|
+ var prodSize = service.Where((SchoolProductSumData x) => x.prodCode == "IPALJ6NY").FirstOrDefault();
|
|
|
+ if(prodSize != null && schoolSize > 0)
|
|
|
+ {
|
|
|
+ prodSize.avaliable = schoolSize;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //取得服務產品週期(只取授權效期中)
|
|
|
+ long today = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
|
|
+ Dictionary<string, List<HabbServiceProdPeriod>> prodPeriodDic = new Dictionary<string, List<HabbServiceProdPeriod>>();
|
|
|
+ await foreach (var itemsv in client.GetItemQueryStreamIterator(queryText: $"SELECT * FROM c WHERE c.dataType = 'servicePeriod' AND c.startDate <= {today} AND {today} <= c.endDate", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Product-{schoolCode}") }))
|
|
|
+ {
|
|
|
+ using var json = await JsonDocument.ParseAsync(itemsv.ContentStream);
|
|
|
+ if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ {
|
|
|
+ foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ {
|
|
|
+ SchoolProductServicePeriod servicePeriodRow = obj.ToObject<SchoolProductServicePeriod>();
|
|
|
+ string prodCode = servicePeriodRow.prodCode;
|
|
|
+ if (!prodPeriodDic.ContainsKey(prodCode))
|
|
|
+ {
|
|
|
+ prodPeriodDic[prodCode] = new List<HabbServiceProdPeriod>();
|
|
|
+ }
|
|
|
+ HabbServiceProdPeriod HabbPeriodNow = new HabbServiceProdPeriod();
|
|
|
+ HabbPeriodNow.id = servicePeriodRow.id;
|
|
|
+ HabbPeriodNow.startDate = servicePeriodRow.startDate;
|
|
|
+ HabbPeriodNow.endDate = servicePeriodRow.endDate;
|
|
|
+ HabbPeriodNow.number = servicePeriodRow.number;
|
|
|
+ HabbPeriodNow.unit = servicePeriodRow.unit;
|
|
|
+ prodPeriodDic[prodCode].Add(HabbPeriodNow);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //結果生成
|
|
|
+ foreach (SchoolProductSumData serviceRow in service)
|
|
|
+ {
|
|
|
+ HabbServiceProd resultRow = new HabbServiceProd();
|
|
|
+ resultRow.avaliable = serviceRow.avaliable;
|
|
|
+ resultRow.prodCode = serviceRow.prodCode;
|
|
|
+ if(prodPeriodDic.ContainsKey(serviceRow.prodCode))
|
|
|
+ {
|
|
|
+ resultRow.period = prodPeriodDic[serviceRow.prodCode];
|
|
|
+ }
|
|
|
+ prod.Add(resultRow);
|
|
|
+ }
|
|
|
+
|
|
|
+ return Ok(new { err, msg, prod });
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ // await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},hiteach/GetTeacherInfo()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
|
|
|
+ return BadRequest();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class HabbServiceProd
|
|
|
+ {
|
|
|
+ public string prodCode { get; set; }
|
|
|
+ public int avaliable { get; set; }
|
|
|
+ public List<HabbServiceProdPeriod> period { get; set; }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class HabbServiceProdPeriod
|
|
|
+ {
|
|
|
+ public string id { get; set; }
|
|
|
+ public long startDate { get; set; }
|
|
|
+ public long endDate { get; set; }
|
|
|
+ public int number { get; set; }
|
|
|
+ public string unit { get; set; }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|