소스 검색

服務產品型別變更、欄位追加:起始時間、終止時間
新增Habb系統用API

jeff 3 년 전
부모
커밋
ce2dbcf08f

+ 1 - 1
TEAMModelBI/Controllers/BISchool/ProductController.cs

@@ -54,7 +54,7 @@ namespace TEAMModelBI.Controllers.BISchool
             SchoolProductSum productSum = new SchoolProductSum(); //产品状态
             List<SchoolProductSumProdInfo> prodinfo = new List<SchoolProductSumProdInfo>(); //学校的产品信息
             List<SchoolProductSumData> serialRecord = new List<SchoolProductSumData>(); //软体购买记录
-            List<SchoolProductSumData> serviceRecord = new List<SchoolProductSumData>(); //服务购买记录
+            List<SchoolProductSumDataService> serviceRecord = new List<SchoolProductSumDataService>(); //服务购买记录
             List<SchoolProductSumDataHard> hardRecord = new List<SchoolProductSumDataHard>(); //硬体购买记录
 
 

+ 21 - 17
TEAMModelOS.FunctionV4/ServiceBus/ActiveTaskTopic.cs

@@ -601,7 +601,8 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
             }
         }
 
-        //更新產品一覽表
+        //更新學校產品一覽表
+        //處理內容:取得所有序號購買紀錄,服務週期、硬體購買紀錄後,更新ProductSum
         [Function("Product")]
         public async Task ProductFunc([ServiceBusTrigger("%Azure:ServiceBus:ActiveTask%", "product", Connection = "Azure:ServiceBus:ConnectionString")] string msg, ILogger log)
         {
@@ -647,37 +648,40 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                     }
                 }
                 ////服務
-                List<SchoolProductSumData> servicesProductSumOrg = new List<SchoolProductSumData>();
-                long timestampToday = DateTimeOffset.UtcNow.AddSeconds(1).ToUnixTimeSeconds(); //比現實時間延遲1秒
-                strQuery = $"SELECT * FROM c WHERE c.dataType = 'service' AND c.startDate <= {timestampToday} AND {timestampToday} <= c.endDate AND c.ttl < 0"; //在授權期間、ttl < 0 才取
-                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: strQuery, requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Product-{schoolId}") }))
+                List<SchoolProductSumDataService> servicesProductSumOrg = new List<SchoolProductSumDataService>();
+                //////取得學校產品 授權週期:授權中 條件: startDate <= now <= endDate
+                long timestampToday = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
+                string strQueryM = $"SELECT * FROM c WHERE c.dataType = 'servicePeriod' AND c.startDate <= {timestampToday} AND {timestampToday} <= c.endDate AND c.ttl < 0";
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: strQueryM, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Product-{schoolId}") }))
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                     {
                         foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
                         {
-                            SchoolProductService serviceInfo = obj.ToObject<SchoolProductService>();
-                            SchoolProductSumData serviceProd = servicesProductSumOrg.Where(sp => sp.prodCode == serviceInfo.prodCode).FirstOrDefault();
+                            SchoolProductServicePeriod servicePeriodInfo = obj.ToObject<SchoolProductServicePeriod>();
+                            SchoolProductSumDataService serviceProd = servicesProductSumOrg.Where(sp => sp.prodCode == servicePeriodInfo.prodCode).FirstOrDefault();
                             if (serviceProd == null)
                             {
-                                SchoolProductSumData serviceProdAdd = new SchoolProductSumData();
-                                serviceProdAdd.prodCode = serviceInfo.prodCode;
+                                SchoolProductSumDataService serviceProdAdd = new SchoolProductSumDataService();
+                                serviceProdAdd.prodCode = servicePeriodInfo.prodCode;
                                 serviceProdAdd.avaliable = 0;
-                                serviceProdAdd.ids.Add(serviceInfo.id);
-                                serviceProdAdd.avaliable += serviceInfo.number;
+                                serviceProdAdd.ids.Add(servicePeriodInfo.id);
+                                serviceProdAdd.avaliable += servicePeriodInfo.number;
+                                serviceProdAdd.startDate = servicePeriodInfo.startDate;
+                                serviceProdAdd.endDate = servicePeriodInfo.endDate;
                                 servicesProductSumOrg.Add(serviceProdAdd);
                             }
                             else
                             {
-                                if (!serviceProd.ids.Contains(serviceInfo.id))
-                                {
-                                    serviceProd.ids.Add(serviceInfo.id);
-                                    serviceProd.avaliable += serviceInfo.number;
-                                }
+                                serviceProd.ids = new List<string>();
+                                serviceProd.ids.Add(servicePeriodInfo.id);
+                                serviceProd.startDate = servicePeriodInfo.startDate;
+                                serviceProd.endDate = servicePeriodInfo.endDate;
                             }
                         }
                     }
+                    
                 }
                 ////服務產品特別對應項
                 School school = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{schoolId}", new PartitionKey("Base")); //學校基本資料取得
@@ -688,7 +692,7 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                 {
                     if (servicesProductSumOrg.Count > 0)
                     {
-                        foreach (SchoolProductSumData servicesProductSumOrgRow in servicesProductSumOrg)
+                        foreach (SchoolProductSumDataService servicesProductSumOrgRow in servicesProductSumOrg)
                         {
                             //更新學校空間
                             if (servicesProductSumOrgRow.prodCode.Equals("IPALJ6NY"))

+ 9 - 3
TEAMModelOS.SDK/Models/Cosmos/School/SchoolProduct.cs

@@ -56,7 +56,7 @@ namespace TEAMModelOS.SDK.Models
             code = "ProductSum";
             prodinfo = new List<SchoolProductSumProdInfo>();
             serial = new List<SchoolProductSumData>();
-            service = new List<SchoolProductSumData>();
+            service = new List<SchoolProductSumDataService>();
             hard = new List<SchoolProductSumDataHard>();
         }
         public string pk { get; set; }
@@ -64,7 +64,7 @@ namespace TEAMModelOS.SDK.Models
         public string id { get; set; }
         public List<SchoolProductSumProdInfo> prodinfo { get; set; }
         public List<SchoolProductSumData> serial { get; set; }
-        public List<SchoolProductSumData> service { get; set; }
+        public List<SchoolProductSumDataService> service { get; set; }
         public List<SchoolProductSumDataHard> hard { get; set; }
         //public Aclassone aclassone { get; set; } //是否獨立出來,未定
     }
@@ -83,6 +83,7 @@ namespace TEAMModelOS.SDK.Models
         space = 2
     }
 
+    //產品一覽 產品內容 基本項
     public class SchoolProductSumData
     {
         public SchoolProductSumData()
@@ -92,10 +93,14 @@ namespace TEAMModelOS.SDK.Models
         public string prodCode { get; set; }
         public List<string> ids { get; set; }
         public int avaliable { get; set; }
+    }
+    //產品一覽 產品內容 服務
+    public class SchoolProductSumDataService : SchoolProductSumData
+    {
         public long startDate { get; set; }
         public long endDate { get; set; }
     }
-
+    //產品一覽 產品內容 硬體
     public class SchoolProductSumDataHard : SchoolProductSumData
     {
         public string model { get; set; }
@@ -129,6 +134,7 @@ namespace TEAMModelOS.SDK.Models
     //服務授權期限(主週期資訊) ※code='Product' code='Product-{SchoolID}' dataType='servicePeriod'
     public class SchoolProductServicePeriod : SchoolProductCommon
     {
+        public int type { get; set; } //授權週期類型 0:銷售 1:試用
         public long startDate { get; set; }
         public long endDate { get; set; }
         public int number { get; set; }

+ 165 - 0
TEAMModelOS/Controllers/Client/HabbController.cs

@@ -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; }
+        }
+
+    }
+}

+ 9 - 13
TEAMModelOS/Controllers/School/SchoolController.cs

@@ -288,7 +288,7 @@ namespace TEAMModelOS.Controllers
         }
 
         /// <summary>
-        /// 取得某學校產品資料 
+        /// 取得某學校產品購買紀錄
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
@@ -306,7 +306,7 @@ namespace TEAMModelOS.Controllers
                 List<SerialInfoBaseWithdeviceBoundExt> serialResult = new List<SerialInfoBaseWithdeviceBoundExt>(); //最後要輸出的序號結果
                 List<SchoolProductService> serviceProduct = new List<SchoolProductService>(); //承接DB資料用:服務
                 List<SchoolProductOrder> serviceOrder = new List<SchoolProductOrder>(); //服務各產品購買紀錄
-                List<SchoolProductSumData> serviceSum = new List<SchoolProductSumData>(); //服務各產品購買紀錄
+                List<SchoolProductSumDataService> serviceSum = new List<SchoolProductSumDataService>(); //服務各產品購買紀錄
                 List<SchoolProductHard> hard = new List<SchoolProductHard>(); //承接DB資料用:硬體
                 SchoolProductSum productSum = new SchoolProductSum(); //承接DB資料用:產品目前狀態 
                 List<SchoolProductSumProdInfo> prodinfo = new List<SchoolProductSumProdInfo>(); //產品資訊列表(名稱、八碼)
@@ -514,8 +514,10 @@ namespace TEAMModelOS.Controllers
                 foreach(SchoolProductService serviceProductRow in serviceProduct)
                 {
                     //取得此產品現在可用數
-                    SchoolProductSumData serviceSumNow = serviceSum.Where(ss => ss.prodCode.Equals(serviceProductRow.prodCode)).FirstOrDefault();
+                    SchoolProductSumDataService serviceSumNow = serviceSum.Where(ss => ss.prodCode.Equals(serviceProductRow.prodCode)).FirstOrDefault();
                     int serviceAvaliableNow = (serviceSumNow != null) ? serviceSumNow.avaliable : 0;
+                    long serviceAvaliableStartDate = (serviceSumNow != null) ? serviceSumNow.startDate : 0;
+                    long serviceAvaliableEndDate = (serviceSumNow != null) ? serviceSumNow.endDate : 0;
                     //取得此產品購買履歷
                     SchoolProductOrder serviceOrderNow = serviceOrder.Where(so => so.prodCode == serviceProductRow.prodCode).FirstOrDefault();
                     if(serviceOrderNow == null) //無此產品項
@@ -531,21 +533,15 @@ namespace TEAMModelOS.Controllers
                         serviceOrderRowOrderList.unit = serviceProductRow.unit;
                         serviceOrderRow.order.Add(serviceOrderRowOrderList);
                         serviceOrderRow.avaliable = serviceAvaliableNow;
-                        if (serviceProductRow.startDate < UTCNow && UTCNow < serviceProductRow.endDate)
-                        {
-                            serviceOrderRow.avaliableStartDate = serviceProductRow.startDate;
-                            serviceOrderRow.avaliableEndDate = serviceProductRow.endDate;
-                        }
+                        serviceOrderRow.avaliableStartDate = serviceAvaliableStartDate;
+                        serviceOrderRow.avaliableEndDate = serviceAvaliableEndDate;
                         serviceOrder.Add(serviceOrderRow);
                     }
                     else //有此產品項 => 看是否有此購買紀錄
                     {
                         //記入可用起始終止日
-                        if (serviceProductRow.startDate < UTCNow && UTCNow < serviceProductRow.endDate)
-                        {
-                            serviceOrderNow.avaliableStartDate = serviceProductRow.startDate;
-                            serviceOrderNow.avaliableEndDate = serviceProductRow.endDate;
-                        }
+                        serviceOrderNow.avaliableStartDate = serviceAvaliableStartDate;
+                        serviceOrderNow.avaliableEndDate = serviceAvaliableEndDate;
                         //記入購買紀錄
                         SchoolProductOrderList SchoolProductOrderListNow = serviceOrderNow.order.Where(Sol => Sol.id.Equals(serviceProductRow.id)).FirstOrDefault();
                         if (SchoolProductOrderListNow == null) //無此購買紀錄