X\choro 11 meses atrás
pai
commit
b1f8111e69
56 arquivos alterados com 785 adições e 461 exclusões
  1. 11 9
      economy/Controllers/Price/Domestic/EmissionController.cs
  2. 8 6
      economy/Controllers/Price/Domestic/FlowerController.cs
  3. 8 6
      economy/Controllers/Price/Domestic/GoldController.cs
  4. 24 25
      economy/Controllers/Price/Domestic/ItemController.cs
  5. 8 6
      economy/Controllers/Price/Domestic/OilController.cs
  6. 99 0
      economy/Controllers/Price/GlobalController.cs
  7. 14 0
      economy/Models/Clients.cs
  8. 0 60
      economy/Models/EmissionModel.cs
  9. 0 1
      economy/Models/FinancialModel.cs
  10. 0 73
      economy/Models/FlowerModel.cs
  11. 0 61
      economy/Models/GoldModel.cs
  12. 0 56
      economy/Models/OilModel.cs
  13. 279 0
      economy/Models/Price/DomesticModel.cs
  14. 68 0
      economy/Models/Price/GlobalModel.cs
  15. 0 82
      economy/Models/ProductModel.cs
  16. 1 1
      economy/Models/Request/Price/Domestic/Emission.cs
  17. 1 1
      economy/Models/Request/Price/Domestic/Flower.cs
  18. 1 1
      economy/Models/Request/Price/Domestic/Gold.cs
  19. 1 1
      economy/Models/Request/Price/Domestic/Item/Detail.cs
  20. 1 1
      economy/Models/Request/Price/Domestic/Item/List.cs
  21. 1 1
      economy/Models/Request/Price/Domestic/Oil.cs
  22. 28 0
      economy/Models/Request/Price/Global/NaturalGas.cs
  23. 1 1
      economy/Models/Response/Price/Domestic/Emission.cs
  24. 1 1
      economy/Models/Response/Price/Domestic/Flower.cs
  25. 1 1
      economy/Models/Response/Price/Domestic/Gold.cs
  26. 1 1
      economy/Models/Response/Price/Domestic/Item/Detail.cs
  27. 1 1
      economy/Models/Response/Price/Domestic/Item/List.cs
  28. 1 1
      economy/Models/Response/Price/Domestic/Oil.cs
  29. 32 0
      economy/Models/Response/Price/Global/NaturalGas.cs
  30. 1 5
      economy/Models/WhoisModel.cs
  31. 1 0
      economy/Program.cs
  32. 10 1
      economy/Views/Home/Index.cshtml
  33. 2 2
      economy/Views/Price/Domestic/Emission.cshtml
  34. 1 1
      economy/Views/Price/Domestic/Flower.cshtml
  35. 1 1
      economy/Views/Price/Domestic/Gold.cshtml
  36. 1 1
      economy/Views/Price/Domestic/Item/Detail.cshtml
  37. 2 2
      economy/Views/Price/Domestic/Item/List.cshtml
  38. 1 1
      economy/Views/Price/Domestic/Oil.cshtml
  39. 72 0
      economy/Views/Price/Global/NaturalGas.cshtml
  40. 28 1
      economy/Views/SCSS/style.scss
  41. 20 19
      economy/Views/Shared/_Layout.cshtml
  42. BIN
      economy/bin/Debug/net8.0/economy.dll
  43. BIN
      economy/bin/Debug/net8.0/economy.exe
  44. BIN
      economy/bin/Debug/net8.0/economy.pdb
  45. 1 5
      economy/economy.csproj
  46. BIN
      economy/obj/Debug/net8.0/apphost.exe
  47. 1 1
      economy/obj/Debug/net8.0/economy.AssemblyInfo.cs
  48. 1 1
      economy/obj/Debug/net8.0/economy.AssemblyInfoInputs.cache
  49. 22 18
      economy/obj/Debug/net8.0/economy.GeneratedMSBuildEditorConfig.editorconfig
  50. 1 1
      economy/obj/Debug/net8.0/economy.csproj.CoreCompileInputs.cache
  51. BIN
      economy/obj/Debug/net8.0/economy.dll
  52. BIN
      economy/obj/Debug/net8.0/economy.pdb
  53. BIN
      economy/obj/Debug/net8.0/ref/economy.dll
  54. BIN
      economy/obj/Debug/net8.0/refint/economy.dll
  55. 28 4
      economy/wwwroot/css/style.css
  56. 0 0
      economy/wwwroot/css/style.min.css

+ 11 - 9
economy/Controllers/EmissionController.cs → economy/Controllers/Price/Domestic/EmissionController.cs

@@ -1,11 +1,12 @@
-using economy.Helpers;
-using economy.Models;
-using economy.Models.Emission;
-using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Filters;
 using Microsoft.AspNetCore.WebUtilities;
+using economy.Helpers;
+using economy.Models;
+using economy.Models.Price.Domestic;
+using economy.Models.Price.Domestic.Emission;
 
-namespace economy.Controllers
+namespace economy.Controllers.Price.Domestic
 {
     public class EmissionController : Controller
     {
@@ -26,6 +27,7 @@ namespace economy.Controllers
             base.OnActionExecuting(context);
         }
 
+        [HttpGet("Price/Domestic/Emission")]
         public async Task<IActionResult> Index(Request request)
         {
             if (!ModelState.IsValid)
@@ -33,15 +35,15 @@ namespace economy.Controllers
                 return BadRequest(ModelState);
             }
 
-            EmissionModel emissionModel = new EmissionModel(_dataGoKR);
-            Response itemList = await emissionModel.GetEmissionPriceInfo(request);
+            DomesticModel domesticModel = new DomesticModel(_dataGoKR, null);
+            Response itemList = await domesticModel.GetEmissionPriceInfo(request);
 
             if (itemList is not null)
             {
                 int listNum = Common.CalcListNumber(itemList.Body.TotalCount, request.PageNo, request.NumOfRows);
                 itemList.Body.Items.ItemList = itemList.Body.Items.ItemList.Select((row, index) =>
                 {
-                    row.Num = (listNum - index);
+                    row.Num = listNum - index;
                     row.Clpr = Common.NumberFormat(row.Clpr);
                     row.Vs = Common.NumberFormat(row.Vs);
                     row.FltRt = Common.NumberFormat(row.FltRt, "0.##");
@@ -68,7 +70,7 @@ namespace economy.Controllers
             var pagination = new Pagination(itemList.Body?.TotalCount, request.PageNo, request.NumOfRows, queryString);
             viewModel.Pagination = pagination;
 
-            return View(viewModel);
+            return View("/Views/Price/Domestic/Emission.cshtml", viewModel);
         }
     }
 }

+ 8 - 6
economy/Controllers/FlowerController.cs → economy/Controllers/Price/Domestic/FlowerController.cs

@@ -3,9 +3,10 @@ using Microsoft.AspNetCore.Mvc.Filters;
 using Microsoft.AspNetCore.WebUtilities;
 using economy.Helpers;
 using economy.Models;
-using economy.Models.Flower;
+using economy.Models.Price.Domestic;
+using economy.Models.Price.Domestic.Flower;
 
-namespace economy.Controllers
+namespace economy.Controllers.Price.Domestic
 {
     public class FlowerController : Controller
     {
@@ -26,6 +27,7 @@ namespace economy.Controllers
             base.OnActionExecuting(context);
         }
 
+        [HttpGet("Price/Domestic/Flower")]
         public async Task<IActionResult> Index(Request request)
         {
             if (!ModelState.IsValid)
@@ -33,15 +35,15 @@ namespace economy.Controllers
                 return BadRequest(ModelState);
             }
 
-            FlowerModel flower = new FlowerModel(_flowerAtOrKR);
-            Response itemList = await flower.GetFlowerPriceInfo(request);
+            DomesticModel domesticModel = new DomesticModel(null, _flowerAtOrKR);
+            Response itemList = await domesticModel.GetFlowerPriceInfo(request);
 
             if (itemList is not null)
             {
                 int listNum = Common.CalcListNumber(itemList.NumberOfRows, request.PageNo, request.NumOfRows);
                 itemList.Items = itemList.Items.Select((row, index) =>
                 {
-                    row.Num = (listNum - index);
+                    row.Num = listNum - index;
                     row.MaxAmt = Common.NumberFormat(row.MaxAmt);
                     row.MinAmt = Common.NumberFormat(row.MinAmt);
                     row.AvgAmt = Common.NumberFormat(row.AvgAmt);
@@ -64,7 +66,7 @@ namespace economy.Controllers
             var pagination = new Pagination(itemList?.NumberOfRows, request.PageNo, request.NumOfRows, queryString);
             viewModel.Pagination = pagination;
 
-            return View(viewModel);
+            return View("/Views/Price/Domestic/Flower.cshtml", viewModel);
         }
     }
 }

+ 8 - 6
economy/Controllers/GoldController.cs → economy/Controllers/Price/Domestic/GoldController.cs

@@ -3,9 +3,10 @@ using Microsoft.AspNetCore.Mvc.Filters;
 using Microsoft.AspNetCore.WebUtilities;
 using economy.Helpers;
 using economy.Models;
-using economy.Models.Gold;
+using economy.Models.Price.Domestic;
+using economy.Models.Price.Domestic.Gold;
 
-namespace economy.Controllers
+namespace economy.Controllers.Price.Domestic
 {
     public class GoldController : Controller
     {
@@ -26,6 +27,7 @@ namespace economy.Controllers
             base.OnActionExecuting(context);
         }
 
+        [HttpGet("Price/Domestic/Gold")]
         public async Task<IActionResult> Index(Request request)
         {
             if (!ModelState.IsValid)
@@ -33,15 +35,15 @@ namespace economy.Controllers
                 return BadRequest(ModelState);
             }
 
-            GoldModel gold = new GoldModel(_dataGoKR);
-            Response itemList = await gold.GetGoldPriceInfo(request);
+            DomesticModel domesticModel = new DomesticModel(_dataGoKR, null);
+            Response itemList = await domesticModel.GetGoldPriceInfo(request);
 
             if (itemList is not null)
             {
                 int listNum = Common.CalcListNumber(itemList.Body.TotalCount, request.PageNo, request.NumOfRows);
                 itemList.Body.Items.ItemList = itemList.Body.Items.ItemList.Select((row, index) =>
                 {
-                    row.Num = (listNum - index);
+                    row.Num = listNum - index;
                     row.Clpr = Common.NumberFormat(row.Clpr);
                     row.Vs = Common.NumberFormat(row.Vs);
                     row.FltRt = Common.NumberFormat(row.FltRt, "0.##");
@@ -68,7 +70,7 @@ namespace economy.Controllers
             var pagination = new Pagination(itemList.Body?.TotalCount, request.PageNo, request.NumOfRows, queryString);
             viewModel.Pagination = pagination;
 
-            return View(viewModel);
+            return View("/Views/Price/Domestic/Gold.cshtml", viewModel);
         }
     }
 }

+ 24 - 25
economy/Controllers/PriceController.cs → economy/Controllers/Price/Domestic/ItemController.cs

@@ -3,27 +3,21 @@ using Microsoft.AspNetCore.WebUtilities;
 using Microsoft.AspNetCore.Mvc.Filters;
 using economy.Models;
 using economy.Helpers;
-using Request = economy.Models.Product;
-using Response = economy.Models.Product;
-using economy.Models.Product;
+using economy.Models.Price.Domestic;
+using Item = economy.Models.Price.Domestic.Item;
 
-namespace economy.Controllers
+namespace economy.Controllers.Price.Domestic
 {
-    public class PriceController : Controller
+    public class ItemController : Controller
     {
         private readonly DataGoKR _dataGoKR;
-        private ProductModel productModel;
+        private readonly DomesticModel _domesticModel;
         private Dictionary<string, string> _queryString;
 
-        public PriceController(DataGoKR dataGoKR)
+        public ItemController(DataGoKR dataGoKR)
         {
             _dataGoKR = dataGoKR;
-            productModel = new ProductModel(_dataGoKR);
-        }
-
-        public async Task<IActionResult> Index(Request.List.Request request)
-        {
-            return await List(request);
+            _domesticModel = new DomesticModel(_dataGoKR, null);
         }
 
         public override void OnActionExecuting(ActionExecutingContext context)
@@ -35,18 +29,23 @@ namespace economy.Controllers
             base.OnActionExecuting(context);
         }
 
+        public async Task<IActionResult> Index(Item.List.Request request)
+        {
+            return await List(request);
+        }
+
         // 품목별 시세
-        [HttpGet("Price/List")]
-        public async Task<IActionResult> List(Request.List.Request request)
+        [HttpGet("Price/Domestic/Item/List.cshtml")]
+        public async Task<IActionResult> List(Item.List.Request request)
         {
             if (!ModelState.IsValid)
             {
                 return BadRequest(ModelState);
             }
 
-            Response.List.Response itemList = await productModel.GetPriceItemList(request);
+            Item.List.Response itemList = await _domesticModel.GetPriceItemList(request);
 
-            var viewModel = new View<Request.List.Request, Response.List.Response>();
+            var viewModel = new View<Item.List.Request, Item.List.Response>();
             viewModel.SelectedListPerPage = request.NumOfRows;
             viewModel.Request = request;
             viewModel.Response = itemList;
@@ -54,12 +53,12 @@ namespace economy.Controllers
             var pagination = new Pagination(itemList.Body?.TotalCount, request.PageNo, request.NumOfRows, null);
             viewModel.Pagination = pagination;
 
-            return View(viewModel);
+            return View("/Views/Price/Domestic/Item/List.cshtml", viewModel);
         }
 
         // 품목 가격 정보
-        [HttpGet("Price/Detail/{item}")]
-        public async Task<IActionResult> Detail([FromRoute] string item, [Bind] Request.Detail.Request request)
+        [HttpGet("Price/Domestic/Item/Detail/{item}")]
+        public async Task<IActionResult> Detail([FromRoute] string item, [Bind] Item.Detail.Request request)
         {
             request.ItemCode = item;
 
@@ -67,20 +66,20 @@ namespace economy.Controllers
             {
                 return BadRequest(ModelState);
             }
-        
-            Response.Detail.Response itemInfo = await productModel.GetPriceItemInfo(request);
+
+            Item.Detail.Response itemInfo = await _domesticModel.GetPriceItemInfo(request);
 
             if (itemInfo.Body is not null)
             {
                 int listNum = Common.CalcListNumber(itemInfo.Body.TotalCount, request.PageNo, request.NumOfRows);
                 itemInfo.Body.Items.ItemList = itemInfo.Body.Items.ItemList.Select((row, index) =>
                 {
-                    row.Num = (listNum - index);
+                    row.Num = listNum - index;
                     return row;
                 }).ToList();
             }
 
-            var viewModel = new View<Response.Detail.Request, Response.Detail.Response>();
+            var viewModel = new View<Item.Detail.Request, Item.Detail.Response>();
             viewModel.SelectedListPerPage = request.NumOfRows;
             viewModel.Request = request;
             viewModel.Response = itemInfo;
@@ -94,7 +93,7 @@ namespace economy.Controllers
             var pagination = new Pagination(itemInfo.Body?.TotalCount, request.PageNo, request.NumOfRows, queryString);
             viewModel.Pagination = pagination;
 
-            return View(viewModel);
+            return View("/Views/Price/Domestic/Item/Detail.cshtml", viewModel);
         }
     }
 }

+ 8 - 6
economy/Controllers/OilController.cs → economy/Controllers/Price/Domestic/OilController.cs

@@ -3,9 +3,10 @@ using Microsoft.AspNetCore.Mvc.Filters;
 using Microsoft.AspNetCore.WebUtilities;
 using economy.Helpers;
 using economy.Models;
-using economy.Models.Oil;
+using economy.Models.Price.Domestic;
+using economy.Models.Price.Domestic.Oil;
 
-namespace economy.Controllers
+namespace economy.Controllers.Price.Domestic
 {
     public class OilController : Controller
     {
@@ -26,6 +27,7 @@ namespace economy.Controllers
             base.OnActionExecuting(context);
         }
 
+        [HttpGet("Price/Domestic/Oil")]
         public async Task<IActionResult> Index(Request request)
         {
             if (!ModelState.IsValid)
@@ -33,15 +35,15 @@ namespace economy.Controllers
                 return BadRequest(ModelState);
             }
 
-            OilModel oil = new OilModel(_dataGoKR);
-            Response itemList = await oil.GetOilPriceInfo(request);
+            DomesticModel domesticModel = new DomesticModel(_dataGoKR, null);
+            Response itemList = await domesticModel.GetOilPriceInfo(request);
 
             if (itemList is not null)
             {
                 int listNum = Common.CalcListNumber(itemList.Body.TotalCount, request.PageNo, request.NumOfRows);
                 itemList.Body.Items.ItemList = itemList.Body.Items.ItemList.Select((row, index) =>
                 {
-                    row.Num = (listNum - index);
+                    row.Num = listNum - index;
                     row.OilCtg = Common.NumberFormat(row.OilCtg);
                     row.WtAvgPrcCptn = Common.NumberFormat(row.WtAvgPrcCptn, "0.##");
                     row.WtAvgPrcDisc = Common.NumberFormat(row.WtAvgPrcDisc);
@@ -65,7 +67,7 @@ namespace economy.Controllers
             var pagination = new Pagination(itemList.Body?.TotalCount, request.PageNo, request.NumOfRows, queryString);
             viewModel.Pagination = pagination;
 
-            return View(viewModel);
+            return View("/Views/Price/Domestic/Oil.cshtml", viewModel);
         }
     }
 }

+ 99 - 0
economy/Controllers/Price/GlobalController.cs

@@ -0,0 +1,99 @@
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Filters;
+using Microsoft.AspNetCore.WebUtilities;
+using economy.Helpers;
+using economy.Models;
+using economy.Models.Financial;
+using economy.Models.Price.Global;
+using NaturalGas = economy.Models.Price.Global.NaturalGas;
+
+namespace economy.Controllers.Price.Global
+{
+    public class GlobalController : Controller
+    {
+        private readonly Alpha_API _alphaAPI;
+        private readonly KoreaEximGoKR _koreaEximGoKR;
+        private Dictionary<string, string> _queryString;
+        private int _exchangeValue = 0;
+
+        public GlobalController(Alpha_API alphaAPI, KoreaEximGoKR koreaEximGoKR)
+        {
+            _alphaAPI = alphaAPI;
+            _koreaEximGoKR = koreaEximGoKR;
+
+            InitializeAsync();
+        }
+
+        // 초기화 메서드
+        public async Task InitializeAsync()
+        {
+            // 환율 조회
+            _exchangeValue = await new FinancialModel(_koreaEximGoKR).GetExchangeValue();
+        }
+
+        public override void OnActionExecuting(ActionExecutingContext context)
+        {
+            _queryString = QueryHelpers.ParseQuery(HttpContext.Request.QueryString.Value).ToDictionary(k => k.Key, v => string.Join(",", v.Value));
+
+            ViewBag.QueryString = _queryString;
+
+            base.OnActionExecuting(context);
+        }
+
+        [HttpGet("Price/Global/NaturalGas")]
+        public async Task<IActionResult> NaturalGas(NaturalGas.Request request)
+        {
+            if (!ModelState.IsValid)
+            {
+                return BadRequest(ModelState);
+            }
+
+            if (!new[] { "daily", "weekly", "monthly" }.Contains(request.Interval))
+            {
+                return BadRequest("Invalid input provided.");
+            }
+
+            GlobalModel globalModel = new GlobalModel(_alphaAPI);
+            NaturalGas.Response itemList = await globalModel.GetNaturalGasPriceInfo(request);
+
+            int total = 0;
+
+           if (itemList.Data != null && itemList.Data.Any())
+            {
+                total = itemList.Data.Count;
+                int listNum = Common.CalcListNumber(total, request.PageNo, request.NumOfRows);
+
+                // 페이징 처리
+                int skip = (request.PageNo - 1) * request.NumOfRows;
+                int take = request.NumOfRows;
+
+                itemList.Data = itemList.Data.Skip(skip).Take(take).Select((row, index) =>
+                {
+                    row.Num = (listNum - index);
+
+                    if (int.TryParse(row.Value, out int value) && value > 0)
+                    {
+                        row.KRW = (value * _exchangeValue);
+                    }
+                  
+                    return row;
+                }).ToList();
+            }
+
+            var viewModel = new View<NaturalGas.Request, NaturalGas.Response>();
+            viewModel.SelectedListPerPage = request.NumOfRows;
+            viewModel.Request = request;
+            viewModel.Response = itemList;
+
+            var queryString = new
+            {
+                date = request.Interval
+            };
+
+            var pagination = new Pagination(total, request.PageNo, request.NumOfRows, queryString);
+            viewModel.Pagination = pagination;
+
+            return View("/Views/Price/Global/NaturalGas.cshtml", viewModel);
+        }
+    }
+}

+ 14 - 0
economy/Models/Clients.cs

@@ -85,4 +85,18 @@ namespace economy.Models
             httpClient.BaseAddress = new Uri(APIUrl);
         }
     }
+
+    // Alphavantage API
+    public class Alpha_API
+    {
+        public readonly HttpClient httpClient;
+        public readonly string APIUrl = "https://www.alphavantage.co";
+        public readonly string APIKey = "EFOBUHL5SFLBF2LN";
+
+        public Alpha_API(HttpClient e)
+        {
+            httpClient = e;
+            httpClient.BaseAddress = new Uri(APIUrl);
+        }
+    }
 }

+ 0 - 60
economy/Models/EmissionModel.cs

@@ -1,60 +0,0 @@
-using System.Text.Json;
-
-namespace economy.Models.Emission
-{
-    public class EmissionModel
-    {
-        private readonly DataGoKR _dataGoKR;
-
-        public EmissionModel(DataGoKR dataGoKR)
-        {
-            _dataGoKR = dataGoKR;
-        }
-
-        // 배출권 시세 조회
-        public async Task<Response> GetEmissionPriceInfo(Request request)
-        {
-            Response parseData = new();
-
-            try
-            {
-                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
-                {
-                    Path = "/1160100/service/GetGeneralProductInfoService/getCertifiedEmissionReductionPriceInfo",
-                    Query = $"serviceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&beginBasDt={request.StartDate:yyyyMMdd}&endBasDt={request.EndDate:yyyyMMdd}&resultType=json"
-                };
-
-                if (request.LikeSrtnCd is not null)
-                {
-                    uriBuilder.Query += $"&likeSrtnCd={request.LikeSrtnCd}";
-                }
-
-                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var jsonString = await response.Content.ReadAsStringAsync();
-
-                    using (var document = JsonDocument.Parse(jsonString))
-                    {
-                        var resEle = document.RootElement.GetProperty("response");
-                        parseData = JsonSerializer.Deserialize<Response>(resEle.GetRawText());
-                    }
-
-                    if (parseData.Body is null)
-                    {
-                        return new Response();
-                    }
-                }
-
-                response.EnsureSuccessStatusCode();
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parseData;
-        }
-    }
-}

+ 0 - 1
economy/Models/FinancialModel.cs

@@ -1,5 +1,4 @@
 using System.Text.Json;
-using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.Caching.Memory;
 
 namespace economy.Models.Financial

+ 0 - 73
economy/Models/FlowerModel.cs

@@ -1,73 +0,0 @@
-using System.Text.Json;
-
-namespace economy.Models.Flower
-{
-    public class FlowerModel
-    {
-        private readonly FlowerAtOrKR _flowerAtOrKR;
-
-        public FlowerModel(FlowerAtOrKR flowerAtOrKR)
-        {
-            _flowerAtOrKR = flowerAtOrKR;
-        }
-
-        // 석유 시세 조회
-        public async Task<Response> GetFlowerPriceInfo(Request request)
-        {
-            Response parseData = new();
-
-            try
-            {
-                var uriBuilder = new UriBuilder(_flowerAtOrKR.APIUrl)
-                {
-                    Path = "/api/returnData.api",
-                    Query = $"kind=f001&serviceKey={_flowerAtOrKR.APIKey}&currentPage={request.PageNo}&countPerPage={request.NumOfRows}&baseDate={request.BaseDate:yyyy-MM-dd}&flowerGubn={(int)request.Type}&dataType=json"
-                };
-
-                if (request.PumName is not null)
-                {
-                    uriBuilder.Query += $"&pumName={request.PumName}";
-                }
-
-                if (request.GoodName is not null)
-                {
-                    uriBuilder.Query += $"&goodName={request.GoodName}";
-                }
-
-                var response = await _flowerAtOrKR.httpClient.GetAsync(uriBuilder.Uri);
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var jsonString = await response.Content.ReadAsStringAsync();
-
-                    using (var document = JsonDocument.Parse(jsonString))
-                    {
-                        if (document.RootElement.TryGetProperty("response", out var resEle))
-                        {
-                            Console.WriteLine("Found 'response' property.");
-                            Console.WriteLine(resEle.GetRawText()); // response 내부 텍스트 출력
-                            parseData = JsonSerializer.Deserialize<Response>(resEle.GetRawText());
-                        }
-                        else
-                        {
-                            Console.WriteLine("'response' property not found in JSON.");
-                        }
-                    }
-
-                    if (parseData.Items is null)
-                    {
-                        return new Response();
-                    }
-                }
-
-                response.EnsureSuccessStatusCode();
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parseData;
-        }
-    }
-}

+ 0 - 61
economy/Models/GoldModel.cs

@@ -1,61 +0,0 @@
-using System.Text.Json;
-
-namespace economy.Models.Gold
-{
-    public class GoldModel
-    {
-        private readonly DataGoKR _dataGoKR;
-
-        public GoldModel(DataGoKR dataGoKR)
-        {
-            _dataGoKR = dataGoKR;
-        }
-
-        // 금 시세 조회
-        public async Task<Response> GetGoldPriceInfo(Request request)
-        {
-            Response parseData = new();
-
-            try
-            {
-                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
-                {
-                    Path = "/1160100/service/GetGeneralProductInfoService/getGoldPriceInfo",
-                    Query = $"serviceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&beginBasDt={request.StartDate:yyyyMMdd}&endBasDt={request.EndDate:yyyyMMdd}&resultType=json"
-                };
-
-                if (request.LikeSrtnCd is not null)
-                {
-                    uriBuilder.Query += $"&likeSrtnCd={request.LikeSrtnCd}";
-                }
-
-                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var jsonString = await response.Content.ReadAsStringAsync();
-
-                    using (var document = JsonDocument.Parse(jsonString))
-                    {
-                        var resEle = document.RootElement.GetProperty("response");
-
-                        parseData = JsonSerializer.Deserialize<Response>(resEle.GetRawText());
-                    }
-
-                    if (parseData.Body is null)
-                    {
-                        return new Response();
-                    }
-                }
-
-                response.EnsureSuccessStatusCode();
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parseData;
-        }
-    }
-}

+ 0 - 56
economy/Models/OilModel.cs

@@ -1,56 +0,0 @@
-using System.Text.Json;
-
-namespace economy.Models.Oil
-{
-    public class OilModel
-    {
-        private readonly DataGoKR _dataGoKR;
-
-        public OilModel(DataGoKR dataGoKR)
-        {
-            _dataGoKR = dataGoKR;
-        }
-
-        // 석유 시세 조회
-        public async Task<Response> GetOilPriceInfo(Request request)
-        {
-            Response parseData = new();
-
-            try
-            {
-                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
-                {
-                    Path = "/1160100/service/GetGeneralProductInfoService/getOilPriceInfo",
-                    Query = $"serviceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&beginBasDt={request.StartDate:yyyyMMdd}&endBasDt={request.EndDate:yyyyMMdd}&resultType=json"
-                };
-
-                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var jsonString = await response.Content.ReadAsStringAsync();
-
-                    using (var document = JsonDocument.Parse(jsonString))
-                    {
-                        var resEle = document.RootElement.GetProperty("response");
-
-                        parseData = JsonSerializer.Deserialize<Response>(resEle.GetRawText());
-                    }
-
-                    if (parseData.Body is null)
-                    {
-                        return new Response();
-                    }
-                }
-
-                response.EnsureSuccessStatusCode();
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parseData;
-        }
-    }
-}

+ 279 - 0
economy/Models/Price/DomesticModel.cs

@@ -0,0 +1,279 @@
+using System.Text.Json;
+using economy.Helpers;
+
+namespace economy.Models.Price.Domestic
+{
+    public class DomesticModel
+    {
+        private readonly DataGoKR? _dataGoKR;
+        private readonly FlowerAtOrKR? _flowerAtOrKR;
+
+        public DomesticModel(DataGoKR? dataGoKR, FlowerAtOrKR? flowerAtOrKR)
+        {
+            _dataGoKR = dataGoKR;
+            _flowerAtOrKR = flowerAtOrKR;
+        }
+
+        // 금 시세 조회
+        public async Task<Gold.Response> GetGoldPriceInfo(Gold.Request request)
+        {
+            Gold.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
+                {
+                    Path = "/1160100/service/GetGeneralProductInfoService/getGoldPriceInfo",
+                    Query = $"serviceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&beginBasDt={request.StartDate:yyyyMMdd}&endBasDt={request.EndDate:yyyyMMdd}&resultType=json"
+                };
+
+                if (request.LikeSrtnCd is not null)
+                {
+                    uriBuilder.Query += $"&likeSrtnCd={request.LikeSrtnCd}";
+                }
+
+                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var jsonString = await response.Content.ReadAsStringAsync();
+
+                    using (var document = JsonDocument.Parse(jsonString))
+                    {
+                        var resEle = document.RootElement.GetProperty("response");
+
+                        parseData = JsonSerializer.Deserialize<Gold.Response>(resEle.GetRawText());
+                    }
+
+                    if (parseData.Body is null)
+                    {
+                        return new Gold.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+
+        // 석유 시세 조회
+        public async Task<Oil.Response> GetOilPriceInfo(Oil.Request request)
+        {
+            Oil.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
+                {
+                    Path = "/1160100/service/GetGeneralProductInfoService/getOilPriceInfo",
+                    Query = $"serviceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&beginBasDt={request.StartDate:yyyyMMdd}&endBasDt={request.EndDate:yyyyMMdd}&resultType=json"
+                };
+
+                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var jsonString = await response.Content.ReadAsStringAsync();
+
+                    using (var document = JsonDocument.Parse(jsonString))
+                    {
+                        var resEle = document.RootElement.GetProperty("response");
+
+                        parseData = JsonSerializer.Deserialize<Oil.Response>(resEle.GetRawText());
+                    }
+
+                    if (parseData.Body is null)
+                    {
+                        return new Oil.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+
+        // 배출권 시세 조회
+        public async Task<Emission.Response> GetEmissionPriceInfo(Emission.Request request)
+        {
+            Emission.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
+                {
+                    Path = "/1160100/service/GetGeneralProductInfoService/getCertifiedEmissionReductionPriceInfo",
+                    Query = $"serviceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&beginBasDt={request.StartDate:yyyyMMdd}&endBasDt={request.EndDate:yyyyMMdd}&resultType=json"
+                };
+
+                if (request.LikeSrtnCd is not null)
+                {
+                    uriBuilder.Query += $"&likeSrtnCd={request.LikeSrtnCd}";
+                }
+
+                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var jsonString = await response.Content.ReadAsStringAsync();
+
+                    using (var document = JsonDocument.Parse(jsonString))
+                    {
+                        var resEle = document.RootElement.GetProperty("response");
+                        parseData = JsonSerializer.Deserialize<Emission.Response>(resEle.GetRawText());
+                    }
+
+                    if (parseData.Body is null)
+                    {
+                        return new Emission.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+
+        // 품목별 가격 목록 조회
+        public async Task<Item.List.Response> GetPriceItemList(Item.List.Request request)
+        {
+            Item.List.Response parsedData = new();
+
+            try
+            {
+                var response = await _dataGoKR.httpClient.GetAsync($"/1240000/bpp_openapi/getPriceItemList?ServiceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}");
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var xmlString = await response.Content.ReadAsStringAsync();
+                    parsedData = await Common.ParseXmlDataAsync<Item.List.Response >(xmlString);
+
+                    if (parsedData.Body is null)
+                    {
+                        return parsedData;
+                    }
+                }
+
+                response.EnsureSuccessStatusCode(); // 예외 발생시킴
+
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parsedData;
+        }
+
+        // 품목 상세 정보 조회
+        public async Task<Item.Detail.Response> GetPriceItemInfo(Item.Detail.Request request)
+        {
+            Item.Detail.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
+                {
+                    Path = "/1240000/bpp_openapi/getPriceInfo",
+                    Query = $"ServiceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&startDate={request.StartDate:yyyy-MM-dd}&endDate={request.EndDate:yyyy-MM-dd}&itemCode={request.ItemCode}"
+                };
+
+                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var xmlString = await response.Content.ReadAsStringAsync();
+                    parseData = await Common.ParseXmlDataAsync<Item.Detail.Response>(xmlString);
+
+
+                    if (parseData.Body is null)
+                    {
+                        return new Item.Detail.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+
+        // 화훼 시세 조회
+        public async Task<Flower.Response> GetFlowerPriceInfo(Flower.Request request)
+        {
+            Flower.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_flowerAtOrKR.APIUrl)
+                {
+                    Path = "/api/returnData.api",
+                    Query = $"kind=f001&serviceKey={_flowerAtOrKR.APIKey}&currentPage={request.PageNo}&countPerPage={request.NumOfRows}&baseDate={request.BaseDate:yyyy-MM-dd}&flowerGubn={(int)request.Type}&dataType=json"
+                };
+
+                if (request.PumName is not null)
+                {
+                    uriBuilder.Query += $"&pumName={request.PumName}";
+                }
+
+                if (request.GoodName is not null)
+                {
+                    uriBuilder.Query += $"&goodName={request.GoodName}";
+                }
+
+                var response = await _flowerAtOrKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var jsonString = await response.Content.ReadAsStringAsync();
+
+                    using (var document = JsonDocument.Parse(jsonString))
+                    {
+                        if (document.RootElement.TryGetProperty("response", out var resEle))
+                        {
+                            Console.WriteLine("Found 'response' property.");
+                            Console.WriteLine(resEle.GetRawText()); // response 내부 텍스트 출력
+                            parseData = JsonSerializer.Deserialize<Flower.Response>(resEle.GetRawText());
+                        }
+                        else
+                        {
+                            Console.WriteLine("'response' property not found in JSON.");
+                        }
+                    }
+
+                    if (parseData.Items is null)
+                    {
+                        return new Flower.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+    }
+}

+ 68 - 0
economy/Models/Price/GlobalModel.cs

@@ -0,0 +1,68 @@
+using System.Text.Json;
+using Microsoft.Extensions.Caching.Memory;
+
+namespace economy.Models.Price.Global
+{
+    public class GlobalModel
+    {
+        private readonly Alpha_API _alphaAPI;
+        private readonly IMemoryCache _cache;
+
+        public GlobalModel(Alpha_API alphaAPI)
+        {
+            _alphaAPI = alphaAPI;
+            _cache = new MemoryCache(new MemoryCacheOptions());
+        }
+       
+        // 천연가스 시세 조회
+        public async Task<NaturalGas.Response> GetNaturalGasPriceInfo(NaturalGas.Request request)
+        {
+            string cacheKey = "ExchangeValue";
+
+            // 캐시에 데이터가 존재하면 반환
+            if (_cache.TryGetValue(cacheKey, out NaturalGas.Response cachedData))
+            {
+                return cachedData;
+            }
+
+            NaturalGas.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_alphaAPI.APIUrl)
+                {
+                    Path = "/query",
+                    Query = $"function=NATURAL_GAS&interval={request.Interval}&apikey={_alphaAPI.APIKey}"
+                };
+
+                var response = await _alphaAPI.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var jsonString = await response.Content.ReadAsStringAsync();
+
+                    using (var document = JsonDocument.Parse(jsonString))
+                    {
+                        parseData = JsonSerializer.Deserialize<NaturalGas.Response>(jsonString);
+
+                        // 캐시에 저장 (1일 동안 유지)
+                        _cache.Set(cacheKey, parseData, TimeSpan.FromDays(1));
+                    }
+
+                    if (parseData.Data is null)
+                    {
+                        return new NaturalGas.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+    }
+}

+ 0 - 82
economy/Models/ProductModel.cs

@@ -1,82 +0,0 @@
-using economy.Helpers;
-
-namespace economy.Models.Product
-{
-    public class ProductModel
-    {
-        private readonly DataGoKR _dataGoKR;
-
-        public ProductModel(DataGoKR dataGoKR)
-        {
-            _dataGoKR = dataGoKR;
-        }
-
-        // 품목별 가격 목록 조회
-        public async Task<List.Response> GetPriceItemList(List.Request request)
-        {
-            List.Response parsedData = new();
-
-            try
-            {
-                var response = await _dataGoKR.httpClient.GetAsync($"/1240000/bpp_openapi/getPriceItemList?ServiceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}");
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var xmlString = await response.Content.ReadAsStringAsync();
-                    parsedData = await Common.ParseXmlDataAsync<List.Response>(xmlString);
-
-                    if (parsedData.Body is null)
-                    {
-                        return parsedData;
-                    }
-                }
-
-                response.EnsureSuccessStatusCode(); // 예외 발생시킴
-
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parsedData;
-        }
-
-        // 품목 상세 정보 조회
-        public async Task<Detail.Response> GetPriceItemInfo(Detail.Request request)
-        {
-            Detail.Response parseData = new();
-
-            try
-            {
-                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
-                {
-                    Path = "/1240000/bpp_openapi/getPriceInfo",
-                    Query = $"ServiceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&startDate={request.StartDate:yyyy-MM-dd}&endDate={request.EndDate:yyyy-MM-dd}&itemCode={request.ItemCode}"
-                };
-
-                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var xmlString = await response.Content.ReadAsStringAsync();
-                    parseData = await Common.ParseXmlDataAsync<Detail.Response>(xmlString);
-
-
-                    if (parseData.Body is null)
-                    {
-                        return new Detail.Response();
-                    }
-                }
-
-                response.EnsureSuccessStatusCode();
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parseData;
-        }
-    }
-}

+ 1 - 1
economy/Models/Request/Market/Emission.cs → economy/Models/Request/Price/Domestic/Emission.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.Emission
+namespace economy.Models.Price.Domestic.Emission
 {
     /*
      * 탄소배출권시장에 상장된 배출권의 시세 정보를 제공

+ 1 - 1
economy/Models/Request/Market/Flower.cs → economy/Models/Request/Price/Domestic/Flower.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.Flower
+namespace economy.Models.Price.Domestic.Flower
 {
     // 부류코드
     public enum SearchType : sbyte

+ 1 - 1
economy/Models/Request/Market/Gold.cs → economy/Models/Request/Price/Domestic/Gold.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.Gold
+namespace economy.Models.Price.Domestic.Gold
 {
     /*
      * KRX금시장에 상장된 금상품의 시세 정보를 제공	

+ 1 - 1
economy/Models/Request/Product/Detail.cs → economy/Models/Request/Price/Domestic/Item/Detail.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.Product.Detail
+namespace economy.Models.Price.Domestic.Item.Detail
 {
     /*
      * 온라인 수집 가격 정보

+ 1 - 1
economy/Models/Request/Product/List.cs → economy/Models/Request/Price/Domestic/Item/List.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.Product.List
+namespace economy.Models.Price.Domestic.Item.List
 {
     /*
      * 온라인 수집 가격 정보

+ 1 - 1
economy/Models/Request/Market/Oil.cs → economy/Models/Request/Price/Domestic/Oil.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.Oil
+namespace economy.Models.Price.Domestic.Oil
 {
     /*
      * 석유전자상거래시장에 상장된 석유상품의 시세 정보를 제공

+ 28 - 0
economy/Models/Request/Price/Global/NaturalGas.cs

@@ -0,0 +1,28 @@
+using Microsoft.AspNetCore.Mvc;
+using System.ComponentModel.DataAnnotations;
+
+namespace economy.Models.Price.Global.NaturalGas
+{
+    /*
+     * 천연가스
+     * 예시 ) https://www.alphavantage.co/query?function=NATURAL_GAS&interval=monthly&apikey=EFOBUHL5SFLBF2LN
+     */
+
+    // 검색요청 변수
+    public class Request
+    {
+        [BindProperty(Name = "page", SupportsGet = true)]
+        [Range(1, int.MaxValue, ErrorMessage = "페이지 허용량을 초과하였습니다.")]
+        public int PageNo { get; set; } = 1;
+
+        [BindProperty(Name = "perPage", SupportsGet = true)]
+        [Range(1, int.MaxValue, ErrorMessage = "출력 허용량을 초과하였습니다.")]
+        public int NumOfRows { get; set; } = 10;
+
+        [ViewData]
+        [BindProperty(Name = "interval", SupportsGet = true)]
+        [Required(ErrorMessage = "검색 구간을 입력해주세요.")]
+        [StringLength(120, ErrorMessage = "검색 구간을 초과하였습니다.")]
+        public required string Interval { get; set; } = "daily"; // weekly, monthly
+    }
+}

+ 1 - 1
economy/Models/Response/Market/Emission.cs → economy/Models/Response/Price/Domestic/Emission.cs

@@ -1,6 +1,6 @@
 using System.Text.Json.Serialization;
 
-namespace economy.Models.Emission
+namespace economy.Models.Price.Domestic.Emission
 {
     // 검색결과 변수
     public class Response

+ 1 - 1
economy/Models/Response/Market/Flower.cs → economy/Models/Response/Price/Domestic/Flower.cs

@@ -1,6 +1,6 @@
 using System.Text.Json.Serialization;
 
-namespace economy.Models.Flower
+namespace economy.Models.Price.Domestic.Flower
 {
     // 검색결과 변수
     public class Response

+ 1 - 1
economy/Models/Response/Market/Gold.cs → economy/Models/Response/Price/Domestic/Gold.cs

@@ -1,6 +1,6 @@
 using System.Text.Json.Serialization;
 
-namespace economy.Models.Gold
+namespace economy.Models.Price.Domestic.Gold
 {
     // 검색결과 변수
     public class Response

+ 1 - 1
economy/Models/Response/Product/Detail.cs → economy/Models/Response/Price/Domestic/Item/Detail.cs

@@ -1,6 +1,6 @@
 using System.Xml.Serialization;
 
-namespace economy.Models.Product.Detail
+namespace economy.Models.Price.Domestic.Item.Detail
 {
     // 검색결과 변수
     [XmlRoot(ElementName = "response")]

+ 1 - 1
economy/Models/Response/Product/List.cs → economy/Models/Response/Price/Domestic/Item/List.cs

@@ -1,6 +1,6 @@
 using System.Xml.Serialization;
 
-namespace economy.Models.Product.List
+namespace economy.Models.Price.Domestic.Item.List
 {
     // 검색결과 변수
     [XmlRoot(ElementName = "response")]

+ 1 - 1
economy/Models/Response/Market/Oil.cs → economy/Models/Response/Price/Domestic/Oil.cs

@@ -1,6 +1,6 @@
 using System.Text.Json.Serialization;
 
-namespace economy.Models.Oil
+namespace economy.Models.Price.Domestic.Oil
 {
     // 검색결과 변수
     public class Response

+ 32 - 0
economy/Models/Response/Price/Global/NaturalGas.cs

@@ -0,0 +1,32 @@
+using System.Text.Json.Serialization;
+
+namespace economy.Models.Price.Global.NaturalGas
+{
+    public class Response
+    {
+        [JsonPropertyName("name")]
+        public string Name { get; set; }
+
+        [JsonPropertyName("interval")]
+        public string Interval { get; set; }
+
+        [JsonPropertyName("unit")]
+        public string Unit { get; set; }
+
+        [JsonPropertyName("data")]
+        public List<Data> Data { get; set; }
+    }
+
+    public class Data
+    {
+        public int Num { get; set; }
+
+        [JsonPropertyName("date")]
+        public string Date { get; set; }
+
+        [JsonPropertyName("value")]
+        public string Value { get; set; }
+
+        public int KRW { get; set; } = 0;
+    }
+}

+ 1 - 5
economy/Models/WhoisModel.cs

@@ -1,8 +1,4 @@
-using System.Collections.Generic;
-using System.Text.Json;
-using economy.Helpers;
-using economy.Models.Whois.Domain;
-using economy.Models.Whois.IP;
+using economy.Helpers;
 
 namespace economy.Models.Whois
 {

+ 1 - 0
economy/Program.cs

@@ -14,6 +14,7 @@ builder.Services.AddHttpClient<KoreaEximGoKR>();
 builder.Services.AddHttpClient<DhlotteryCoKR>();
 builder.Services.AddHttpClient<FIFA_API>();
 builder.Services.AddHttpClient<NTS_API>();
+builder.Services.AddHttpClient<Alpha_API>();
 
 // DB ¿¬°á
 builder.Services.AddDbContext<EconomyContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

+ 10 - 1
economy/Views/Home/Index.cshtml

@@ -4,7 +4,16 @@
 
 <div class="text-center align-mi">
     <h1 class="display-4">환영합니다.</h1>
-    <p class="mb-2">본 사이트는 국내 공공기관 및 비영리 기관으로 API 지원받아 제작되었습니다.</p>
+    <p class="mb-2">본 사이트는 국내 공공기관 및 비영리 기관으로 API를 사용하여 제작되었습니다.</p>
 
     또한 개인 학습 및 편의 기능을 제공하기 위해 제작되어 비상업적으로 운영됨을 밝힙니다.
+
+    <br/>
+    <br/>
+
+    <div class="row justify-content-center">
+        <div class="col col-sm-6 col-md-7">
+            <iframe src="https://coupa.ng/cgRMWJ" width="100%" height="75" frameborder="0" scrolling="no" referrerpolicy="unsafe-url" browsingtopics></iframe>
+        </div>
+    </div>
 </div>

+ 2 - 2
economy/Views/Emission/Index.cshtml → economy/Views/Price/Domestic/Emission.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.Emission.Request, economy.Models.Emission.Response>
+@model economy.Models.View<economy.Models.Price.Domestic.Emission.Request, economy.Models.Price.Domestic.Emission.Response>
 
 @{
     ViewData["Title"] = "배출권 시세";
@@ -55,7 +55,7 @@
                             <td>@row.Num</td>
                             <td>@row.BasDt</td>
                             <td>
-                                <a asp-controller="Emission" asp-action="Index" asp-route-code="@row.SrtnCd" asp-route-sDate="@Model.Request.StartDate" asp-route-eDate="@Model.Request.EndDate">@row.ItmsNm</a>
+                                <a asp-controller="Emission" asp-action="Index" asp-route-code="@row.SrtnCd" asp-route-sDate="@Model.Request.StartDate.ToString("yyyy-MM-dd")" asp-route-eDate="@Model.Request.EndDate.ToString("yyyy-MM-dd")">@row.ItmsNm</a>
                                 <span class="text-primary" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-html="true" data-bs-title="코드: @row.SrtnCd<br/>ISIN: @row.IsinCd">
                                     <i class="bi bi-exclamation-circle"></i>
                                 </span>

+ 1 - 1
economy/Views/Flower/Index.cshtml → economy/Views/Price/Domestic/Flower.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.Flower.Request, economy.Models.Flower.Response>
+@model economy.Models.View<economy.Models.Price.Domestic.Flower.Request, economy.Models.Price.Domestic.Flower.Response>
 
 @{
     ViewData["Title"] = "화훼 시세";

+ 1 - 1
economy/Views/Gold/Index.cshtml → economy/Views/Price/Domestic/Gold.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.Gold.Request, economy.Models.Gold.Response>
+@model economy.Models.View<economy.Models.Price.Domestic.Gold.Request, economy.Models.Price.Domestic.Gold.Response>
 
 @{
     ViewData["Title"] = "금 시세";

+ 1 - 1
economy/Views/Price/Detail.cshtml → economy/Views/Price/Domestic/Item/Detail.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.Product.Detail.Request, economy.Models.Product.Detail.Response>
+@model economy.Models.View<economy.Models.Price.Domestic.Item.Detail.Request, economy.Models.Price.Domestic.Item.Detail.Response>
 
 @{
     ViewData["Title"] = "품목 가격 정보";

+ 2 - 2
economy/Views/Price/List.cshtml → economy/Views/Price/Domestic/Item/List.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.Product.List.Request, economy.Models.Product.List.Response>
+@model economy.Models.View<economy.Models.Price.Domestic.Item.List.Request, economy.Models.Price.Domestic.Item.List.Response>
 
 @{
     ViewData["Title"] = "품목별 시세";
@@ -45,7 +45,7 @@
                             <td>@row.Ic</td>
                             <td>@row.In</td>
                             <td>
-                                @Html.ActionLink("[가격 정보]", "Detail", "Price", new {id=@row.Ic})
+                                <a asp-area="" asp-controller="Item" asp-action="Detail" asp-route-item="@row.Ic" rel="search">[가격 정보]</a>
                             </td>
                         </tr>
                     }

+ 1 - 1
economy/Views/Oil/Index.cshtml → economy/Views/Price/Domestic/Oil.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.Oil.Request, economy.Models.Oil.Response>
+@model economy.Models.View<economy.Models.Price.Domestic.Oil.Request, economy.Models.Price.Domestic.Oil.Response>
 
 @{
     ViewData["Title"] = "석유 시세";

+ 72 - 0
economy/Views/Price/Global/NaturalGas.cshtml

@@ -0,0 +1,72 @@
+@model economy.Models.View<economy.Models.Price.Global.NaturalGas.Request, economy.Models.Price.Global.NaturalGas.Response>
+
+@{
+    ViewData["Title"] = "천연가스 시세";
+}
+
+<div class="container">
+    <h3>@ViewData["Title"]</h3>
+
+    <div class="row mt-3">
+        <div class="col align-self-center">
+            @((Model?.Response?.Data?.Count ?? 0).ToString("N0")) 개
+        </div>
+        <div class="col-auto">
+            <div class="row g-2">
+                <div class="col">
+                    <select name="perPage" id="perPage" class="form-select" asp-for="SelectedListPerPage" asp-items="Model.ListPerPage" form="fSearch"></select>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="table-responsive">
+        <table id="globalPriceList" class="table table-bordered table-hover">
+            <caption class="caption-top">
+                
+            </caption>
+            <thead>
+                <tr>
+                    <th>번호</th>
+                    <th>날짜</th>
+                    <th>달러($)</th>
+                    <th>원화(\)</th>
+                </tr>
+            </thead>
+            <tbody>
+                @if (Model.Response.Data != null && Model.Response.Data?.Count > 0)
+                {
+                    @foreach (var row in Model.Response.Data)
+                    {
+                        <tr>
+                            <td>@row.Num</td>
+                            <td>@row.Date</td>
+                            <td>@row.Value</td>
+                            <td>@row.KRW</td>
+                        </tr>
+                    }
+                }
+                else
+                {
+                    <tr>
+                        <td colspan="4">
+                            No data.
+                        </td>
+                    </tr>
+                }
+            </tbody>
+        </table>
+    </div>
+
+ 
+
+    @await Html.PartialAsync("~/Views/Component/Pagination.cshtml", Model.Pagination)
+
+</div>
+
+@section Scripts {
+    <script src="~/js/oil.js" asp-append-version="true"></script>
+}
+@section Styles {
+    <link href="~/css/style.css" rel="stylesheet" asp-append-version="true" />
+}

+ 28 - 1
economy/Views/SCSS/style.scss

@@ -33,7 +33,34 @@
     }
 }
 
-#priceItemList, #priceItemInfo, #goldPriceInfo, #oilPriceInfo, #emissionPriceInfo, #flowerPrice, #dayHoliday, #dayAnniversary, #daySeasonal, #daySundry, #financialExchange {
+body {
+    display: flex;
+    flex-direction: column;
+    height: 100%;
+
+    main {
+        flex: 1;
+        margin-bottom: 70px;
+    }
+}
+
+footer {
+    bottom: 0;
+    width: 100%;
+    white-space: nowrap;
+    line-height: 60px;
+
+    iframe {
+        width: inherit;
+    }
+
+    small {
+        display: block;
+        line-height: initial;
+    }
+}
+
+#priceItemList, #priceItemInfo, #goldPriceInfo, #oilPriceInfo, #emissionPriceInfo, #flowerPrice, #dayHoliday, #dayAnniversary, #daySeasonal, #daySundry, #financialExchange, #globalPriceList {
     min-width: 740px;
 
     thead {

+ 20 - 19
economy/Views/Shared/_Layout.cshtml

@@ -30,7 +30,7 @@
                 <div id="navMenu" class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                     <ul class="navbar-nav flex-grow-1 justify-content-center">
                         <li class="nav-item dropdown">
-                            <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">시세</a>
+                            <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">국내 시세</a>
                             <ul class="dropdown-menu">
 
                                 <!-- 2024.10.10 추가 -->
@@ -44,15 +44,22 @@
                                     <a class="nav-link text-dark" asp-area="" asp-controller="Emission" asp-action="Index">배출권</a>
                                 </li>
                                 <li>
-                                    <a class="nav-link text-dark" asp-area="" asp-controller="Price" asp-action="List">품목별</a>
+                                    <a class="nav-link text-dark" asp-area="" asp-controller="Item" asp-action="List">품목별</a>
                                 </li>
                                 <li>
                                     <a class="nav-link text-dark" asp-area="" asp-controller="Flower" asp-action="Index">화훼</a>
                                 </li>
+                            </ul>
+                        </li>
+
+                        @*
+                        <li class="nav-item dropdown">
+                            <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">국제 시세</a>
+                            <ul class="dropdown-menu">
 
                                 <!-- 2024.12.14 추가 -->
                                 <li>
-                                    <a class="nav-link text-dark" asp-area="" asp-controller="Flower" asp-action="Index">천연가스</a>
+                                    <a class="nav-link text-dark" asp-area="" asp-controller="Global" asp-action="NaturalGas">천연가스</a>
                                 </li>
                                 <li>
                                     <a class="nav-link text-dark" asp-area="" asp-controller="Flower" asp-action="Index">구리</a>
@@ -75,9 +82,10 @@
                                 <li>
                                     <a class="nav-link text-dark" asp-area="" asp-controller="Flower" asp-action="Index">원자재</a>
                                 </li>
-
                             </ul>
                         </li>
+                        *@
+
                         <li class="nav-item">
                             <a class="nav-link text-dark" asp-area="" asp-controller="Days" asp-action="Holiday">공휴일/특일</a>
                         </li>
@@ -105,23 +113,16 @@
         </nav>
     </header>
 
-    <div class="container">
-        <main role="main" class="pb-3">
-            @RenderBody()
-        </main>
-    </div>
-
-    <footer class="border-top footer text-muted">
+    <main role="main" class="pb-3">
         <div class="container">
-            <div class="row">
-                <div class="col text-center text-lg-start">
-                    &copy; 2023 ~ @DateTime.Now.Year - <a href="https://web.or.kr" ref="author" target="_blank">www.web.or.kr</a>
-                </div>
-                <div class="col text-center text-lg-end">
-                    <small>※ 쿠팡 파트너스 활동을 통해 일정액의 수수료를 제공받을수 있습니다.</small>
-                </div>
-            </div>
+            @RenderBody()
         </div>
+    </main>
+  
+    <footer class="border-top text-muted text-center">
+        <iframe src="https://ads-partners.coupang.com/widgets.html?id=825687&template=carousel&trackingCode=AF0305179&subId=&width=680&height=140&tsource=" width="680" height="140" frameborder="0" scrolling="no" referrerpolicy="unsafe-url" browsingtopics></iframe>
+        <small>※ 쿠팡 파트너스 활동을 통해 일정액의 수수료를 제공받을수 있습니다.</small>
+        <a href="https://web.or.kr" ref="author" target="_blank">copyright &copy; 2023 ~ @DateTime.Now.Year All rights reserved.</a>
     </footer>
 
     <script src="~/lib/jquery/dist/jquery.min.js"></script>

BIN
economy/bin/Debug/net8.0/economy.dll


BIN
economy/bin/Debug/net8.0/economy.exe


BIN
economy/bin/Debug/net8.0/economy.pdb


+ 1 - 5
economy/economy.csproj

@@ -23,7 +23,7 @@
     </ItemGroup>
 
     <ItemGroup>
-        <Content Update="Views\Price\Detail.cshtml">
+        <Content Update="Views\Price\Domestic\Item\Detail.cshtml">
             <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
             <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
         </Content>
@@ -41,9 +41,5 @@
 		<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
 		<PackageReference Include="System.Text.Encoding.CodePages" Version="8.0.0" />
 	</ItemGroup>
-
-	<ItemGroup>
-	  <Folder Include="Views\Prices\" />
-	</ItemGroup>
 	
 </Project>

BIN
economy/obj/Debug/net8.0/apphost.exe


+ 1 - 1
economy/obj/Debug/net8.0/economy.AssemblyInfo.cs

@@ -15,7 +15,7 @@ using System.Reflection;
 [assembly: System.Reflection.AssemblyCompanyAttribute("economy")]
 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
-[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+cc29573eee04f68a4d4ae56be773e047d7ac40bf")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+bfdc55b83febc00550c3ae10f0c5747e283d6167")]
 [assembly: System.Reflection.AssemblyProductAttribute("economy")]
 [assembly: System.Reflection.AssemblyTitleAttribute("economy")]
 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

+ 1 - 1
economy/obj/Debug/net8.0/economy.AssemblyInfoInputs.cache

@@ -1 +1 @@
-1bc6466b9d0c187e9045e779a6b37993bc8b5c501254d88a03b6cc9615f5e121
+601943631b8c82992a0de4c71b78d61a8fe2f2f7cd33209cd0e4edd9c93d1a35

+ 22 - 18
economy/obj/Debug/net8.0/economy.GeneratedMSBuildEditorConfig.editorconfig

@@ -46,10 +46,6 @@ build_metadata.AdditionalFiles.CssScope =
 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcRGF5c1xTdW5kcnkuY3NodG1s
 build_metadata.AdditionalFiles.CssScope = 
 
-[E:/workspace/economy/economy/Views/Emission/Index.cshtml]
-build_metadata.AdditionalFiles.TargetPath = Vmlld3NcRW1pc3Npb25cSW5kZXguY3NodG1s
-build_metadata.AdditionalFiles.CssScope = 
-
 [E:/workspace/economy/economy/Views/FIFA/Index.cshtml]
 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcRklGQVxJbmRleC5jc2h0bWw=
 build_metadata.AdditionalFiles.CssScope = 
@@ -70,14 +66,6 @@ build_metadata.AdditionalFiles.CssScope =
 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcRmluYW5jaWFsXE5hdlRhYi5jc2h0bWw=
 build_metadata.AdditionalFiles.CssScope = 
 
-[E:/workspace/economy/economy/Views/Flower/Index.cshtml]
-build_metadata.AdditionalFiles.TargetPath = Vmlld3NcRmxvd2VyXEluZGV4LmNzaHRtbA==
-build_metadata.AdditionalFiles.CssScope = 
-
-[E:/workspace/economy/economy/Views/Gold/Index.cshtml]
-build_metadata.AdditionalFiles.TargetPath = Vmlld3NcR29sZFxJbmRleC5jc2h0bWw=
-build_metadata.AdditionalFiles.CssScope = 
-
 [E:/workspace/economy/economy/Views/Home/Index.cshtml]
 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcSG9tZVxJbmRleC5jc2h0bWw=
 build_metadata.AdditionalFiles.CssScope = 
@@ -90,16 +78,32 @@ build_metadata.AdditionalFiles.CssScope =
 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcTG90dG9cSW5kZXguY3NodG1s
 build_metadata.AdditionalFiles.CssScope = 
 
-[E:/workspace/economy/economy/Views/Oil/Index.cshtml]
-build_metadata.AdditionalFiles.TargetPath = Vmlld3NcT2lsXEluZGV4LmNzaHRtbA==
+[E:/workspace/economy/economy/Views/Price/Domestic/Emission.cshtml]
+build_metadata.AdditionalFiles.TargetPath = Vmlld3NcUHJpY2VcRG9tZXN0aWNcRW1pc3Npb24uY3NodG1s
+build_metadata.AdditionalFiles.CssScope = 
+
+[E:/workspace/economy/economy/Views/Price/Domestic/Flower.cshtml]
+build_metadata.AdditionalFiles.TargetPath = Vmlld3NcUHJpY2VcRG9tZXN0aWNcRmxvd2VyLmNzaHRtbA==
+build_metadata.AdditionalFiles.CssScope = 
+
+[E:/workspace/economy/economy/Views/Price/Domestic/Gold.cshtml]
+build_metadata.AdditionalFiles.TargetPath = Vmlld3NcUHJpY2VcRG9tZXN0aWNcR29sZC5jc2h0bWw=
+build_metadata.AdditionalFiles.CssScope = 
+
+[E:/workspace/economy/economy/Views/Price/Domestic/Item/Detail.cshtml]
+build_metadata.AdditionalFiles.TargetPath = Vmlld3NcUHJpY2VcRG9tZXN0aWNcSXRlbVxEZXRhaWwuY3NodG1s
+build_metadata.AdditionalFiles.CssScope = 
+
+[E:/workspace/economy/economy/Views/Price/Domestic/Item/List.cshtml]
+build_metadata.AdditionalFiles.TargetPath = Vmlld3NcUHJpY2VcRG9tZXN0aWNcSXRlbVxMaXN0LmNzaHRtbA==
 build_metadata.AdditionalFiles.CssScope = 
 
-[E:/workspace/economy/economy/Views/Price/Detail.cshtml]
-build_metadata.AdditionalFiles.TargetPath = Vmlld3NcUHJpY2VcRGV0YWlsLmNzaHRtbA==
+[E:/workspace/economy/economy/Views/Price/Domestic/Oil.cshtml]
+build_metadata.AdditionalFiles.TargetPath = Vmlld3NcUHJpY2VcRG9tZXN0aWNcT2lsLmNzaHRtbA==
 build_metadata.AdditionalFiles.CssScope = 
 
-[E:/workspace/economy/economy/Views/Price/List.cshtml]
-build_metadata.AdditionalFiles.TargetPath = Vmlld3NcUHJpY2VcTGlzdC5jc2h0bWw=
+[E:/workspace/economy/economy/Views/Price/Global/NaturalGas.cshtml]
+build_metadata.AdditionalFiles.TargetPath = Vmlld3NcUHJpY2VcR2xvYmFsXE5hdHVyYWxHYXMuY3NodG1s
 build_metadata.AdditionalFiles.CssScope = 
 
 [E:/workspace/economy/economy/Views/Shared/Error.cshtml]

+ 1 - 1
economy/obj/Debug/net8.0/economy.csproj.CoreCompileInputs.cache

@@ -1 +1 @@
-d324c161c47904d78fbe51056ef6e65ad1e5cfb72a0ca8c51df1455d9b474a6f
+edba45eb7e45b1cd9b8f3459470cc70e8a38f931daa4511672abf9cdea45d000

BIN
economy/obj/Debug/net8.0/economy.dll


BIN
economy/obj/Debug/net8.0/economy.pdb


BIN
economy/obj/Debug/net8.0/ref/economy.dll


BIN
economy/obj/Debug/net8.0/refint/economy.dll


+ 28 - 4
economy/wwwroot/css/style.css

@@ -23,19 +23,43 @@ header nav > div > div > ul > li a:hover {
   text-decoration: underline;
 }
 
-#priceItemList, #priceItemInfo, #goldPriceInfo, #oilPriceInfo, #emissionPriceInfo, #flowerPrice, #dayHoliday, #dayAnniversary, #daySeasonal, #daySundry, #financialExchange {
+body {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+}
+body main {
+  flex: 1;
+  margin-bottom: 70px;
+}
+
+footer {
+  bottom: 0;
+  width: 100%;
+  white-space: nowrap;
+  line-height: 60px;
+}
+footer iframe {
+  width: inherit;
+}
+footer small {
+  display: block;
+  line-height: initial;
+}
+
+#priceItemList, #priceItemInfo, #goldPriceInfo, #oilPriceInfo, #emissionPriceInfo, #flowerPrice, #dayHoliday, #dayAnniversary, #daySeasonal, #daySundry, #financialExchange, #globalPriceList {
   min-width: 740px;
 }
-#priceItemList thead tr th, #priceItemInfo thead tr th, #goldPriceInfo thead tr th, #oilPriceInfo thead tr th, #emissionPriceInfo thead tr th, #flowerPrice thead tr th, #dayHoliday thead tr th, #dayAnniversary thead tr th, #daySeasonal thead tr th, #daySundry thead tr th, #financialExchange thead tr th {
+#priceItemList thead tr th, #priceItemInfo thead tr th, #goldPriceInfo thead tr th, #oilPriceInfo thead tr th, #emissionPriceInfo thead tr th, #flowerPrice thead tr th, #dayHoliday thead tr th, #dayAnniversary thead tr th, #daySeasonal thead tr th, #daySundry thead tr th, #financialExchange thead tr th, #globalPriceList thead tr th {
   text-align: center;
   background-color: #eee;
   vertical-align: middle;
 }
-#priceItemList tbody tr td, #priceItemInfo tbody tr td, #goldPriceInfo tbody tr td, #oilPriceInfo tbody tr td, #emissionPriceInfo tbody tr td, #flowerPrice tbody tr td, #dayHoliday tbody tr td, #dayAnniversary tbody tr td, #daySeasonal tbody tr td, #daySundry tbody tr td, #financialExchange tbody tr td {
+#priceItemList tbody tr td, #priceItemInfo tbody tr td, #goldPriceInfo tbody tr td, #oilPriceInfo tbody tr td, #emissionPriceInfo tbody tr td, #flowerPrice tbody tr td, #dayHoliday tbody tr td, #dayAnniversary tbody tr td, #daySeasonal tbody tr td, #daySundry tbody tr td, #financialExchange tbody tr td, #globalPriceList tbody tr td {
   text-align: center;
   vertical-align: middle;
 }
-#priceItemList tbody tr td span[data-bs-toggle=tooltip], #priceItemInfo tbody tr td span[data-bs-toggle=tooltip], #goldPriceInfo tbody tr td span[data-bs-toggle=tooltip], #oilPriceInfo tbody tr td span[data-bs-toggle=tooltip], #emissionPriceInfo tbody tr td span[data-bs-toggle=tooltip], #flowerPrice tbody tr td span[data-bs-toggle=tooltip], #dayHoliday tbody tr td span[data-bs-toggle=tooltip], #dayAnniversary tbody tr td span[data-bs-toggle=tooltip], #daySeasonal tbody tr td span[data-bs-toggle=tooltip], #daySundry tbody tr td span[data-bs-toggle=tooltip], #financialExchange tbody tr td span[data-bs-toggle=tooltip] {
+#priceItemList tbody tr td span[data-bs-toggle=tooltip], #priceItemInfo tbody tr td span[data-bs-toggle=tooltip], #goldPriceInfo tbody tr td span[data-bs-toggle=tooltip], #oilPriceInfo tbody tr td span[data-bs-toggle=tooltip], #emissionPriceInfo tbody tr td span[data-bs-toggle=tooltip], #flowerPrice tbody tr td span[data-bs-toggle=tooltip], #dayHoliday tbody tr td span[data-bs-toggle=tooltip], #dayAnniversary tbody tr td span[data-bs-toggle=tooltip], #daySeasonal tbody tr td span[data-bs-toggle=tooltip], #daySundry tbody tr td span[data-bs-toggle=tooltip], #financialExchange tbody tr td span[data-bs-toggle=tooltip], #globalPriceList tbody tr td span[data-bs-toggle=tooltip] {
   color: blue;
   cursor: pointer;
   font-weight: bold;

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
economy/wwwroot/css/style.min.css


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff