SiteController.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. using System;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using FMSAdmin.Data;
  5. using FMSAdmin.Models;
  6. using FMSAdmin.Entities;
  7. using FMSAdmin.Services;
  8. using Microsoft.AspNetCore.Mvc;
  9. using Microsoft.Extensions.Logging;
  10. using Microsoft.AspNetCore.Authorization;
  11. using Microsoft.EntityFrameworkCore;
  12. using FMSAdmin.Helpers;
  13. using System.Data;
  14. using System.IO;
  15. using OfficeOpenXml;
  16. using Newtonsoft.Json;
  17. using Microsoft.AspNetCore.Http;
  18. using System.Collections.Generic;
  19. using System.Collections;
  20. namespace FMSAdmin.Controllers {
  21. [Authorize]
  22. [ApiController]
  23. [ApiVersion("1")]
  24. [Route("api/[controller]")]
  25. public class SiteController : Controller {
  26. private readonly ILogger<SiteController> _logger;
  27. private readonly FMSContext _context;
  28. private SiteService _service;
  29. private readonly StorageHelper _storage;
  30. public SiteController(
  31. ILogger<SiteController> logger,
  32. FMSContext context,
  33. SiteService service,
  34. StorageHelper storage
  35. ) {
  36. _logger = logger;
  37. _context = context;
  38. _service = service;
  39. _storage = storage;
  40. }
  41. /// <summary>
  42. /// 검색 & 정렬
  43. /// </summary>
  44. /// <param name="req"></param>
  45. /// <returns></returns>
  46. private IQueryable<CmSite> _FilterAndSort(PagingRequest req) {
  47. var query = _service.GetAll();
  48. query = query.Filter(req.conditions);
  49. if (req.siteId != null) {
  50. query = query.Where(x => x.SiteId == Util.ToInt(req.siteId));
  51. }
  52. query = query.Sort(req.sort);
  53. return query;
  54. }
  55. // 셀렉트 공통
  56. private dynamic _ListSelect(IQueryable<CmSite> query) {
  57. var list = query.Select(x => new {
  58. x.SiteId,
  59. x.Name,
  60. x.Address1,
  61. x.PhoneNo,
  62. x.IsControlSchedule,
  63. x.CompletionDate,
  64. x.BuildingSize,
  65. GrossArea = AreaParse(x.GrossArea),
  66. BuildingArea = AreaParse(x.BuildingArea),
  67. x.FloorAreaRatio,
  68. x.BuildingCoverageRatio,
  69. IsUse = x.IsUse.GetValueOrDefault() ? "Y" : "N",
  70. x.SortOrderNo
  71. });
  72. return list;
  73. }
  74. private static string AreaParse(String areaVal) {
  75. string returnVal = "";
  76. float val;
  77. if (!Util.IsNullOrEmpty(areaVal) && float.TryParse(areaVal, out val)) {
  78. returnVal = val.ToString("#,##0.00") + "㎡ (" + (val / 3.3058).ToString("#,##0.00") + "평)";
  79. }
  80. return returnVal;
  81. }
  82. /// <summary>
  83. /// 목록
  84. /// </summary>
  85. /// <param name="req"></param>
  86. /// <param name="siteId"></param>
  87. /// <param name="type"></param>
  88. /// <returns></returns>
  89. [HttpGet]
  90. public IActionResult List([FromQuery] PagingRequest req) {
  91. var query = _FilterAndSort(req);
  92. var list = _ListSelect(query);
  93. var paging = PagingList.Pagination(list, req.page, req.limit);
  94. return Ok(paging);
  95. }
  96. // 엑셀 다운로드
  97. [AllowAnonymous]
  98. [HttpGet("excel")]
  99. public IActionResult ExportExcel([FromQuery] PagingRequest req, string filename) {
  100. var query = _FilterAndSort(req);
  101. var list = _ListSelect(query);
  102. var stream = new MemoryStream();
  103. using (var package = new ExcelPackage(stream)) {
  104. var workSheet = package.Workbook.Worksheets.Add("Sheet1");
  105. workSheet.Cells.LoadFromCollection(list, true);
  106. if (req.columns != null && req.columns.Length > 0) {
  107. workSheet.AddStyle(req.columns, req.sort?.order?.ToLower() == "asc", filename);
  108. }
  109. package.Save();
  110. }
  111. stream.Position = 0;
  112. string excelName = $"excel-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
  113. return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName);
  114. }
  115. /// <summary>
  116. /// 상세
  117. /// </summary>
  118. /// <param name="siteId"></param>
  119. /// <returns></returns>
  120. [HttpGet("{siteId}")]
  121. public IActionResult Get(int siteId) {
  122. var siteInfo = _service.Get(siteId);
  123. if (siteInfo.Count() == 0) {
  124. return NotFound("사이트 정보를 찾을 수 없습니다.");
  125. }
  126. var list = siteInfo.Select(x => new {
  127. x.SiteId,
  128. x.Name,
  129. x.PhoneNo,
  130. x.AddressZip1,
  131. x.CompletionDate, //준공연도
  132. x.Address1,
  133. x.Adderss2,
  134. x.BuildingSize, //건축규모
  135. GrossArea = x.GrossArea,
  136. BuildingArea = x.BuildingArea,
  137. x.FloorAreaRatio, //용적율
  138. x.BuildingCoverageRatio, //건폐율
  139. x.MainUse, //주용도
  140. x.MainUseIndex,
  141. x.IsControlSchedule, //제어스케줄
  142. x.ScheduleCheckHour, //스케쥴알림시간
  143. x.Standard, //용도별 표준값
  144. x.Hdd, // HDD 기준온도
  145. x.Cdd, // CDD 기준 온도
  146. x.Url, //홈페이지
  147. x.Comment, //비고
  148. ImageFile = _storage.ParseFile(x.ImageFile),
  149. x.ApiSido,
  150. x.ApiSigun,
  151. x.ImageMapX,
  152. x.ImageMapY,
  153. x.IsUse,
  154. x.DesignSupervision,
  155. x.ConstructionCompany,
  156. x.ConstructionPeriod,
  157. x.Structure,
  158. x.LobbyFloor,
  159. x.OfficeFloor,
  160. x.ToiletFloor,
  161. x.EVHall,
  162. x.ParkingLot,
  163. x.ParkingFacilities,
  164. x.OuterWall,
  165. LandArea = x.LandArea,
  166. LandscapingArea = x.LandscapingArea,
  167. x.BuildingFloors,
  168. x.BuildingHeight,
  169. x.ConversionRate,
  170. x.AuditoriumFacilities
  171. });
  172. return Ok(list.First());
  173. }
  174. /// <summary>
  175. /// 등록
  176. /// </summary>
  177. [HttpPut]
  178. public IActionResult Create([FromBody] CmSite data) {
  179. _logger.LogInformation("Create");
  180. //_logger.LogInformation(data.Dump());
  181. if (ModelState.IsValid) {
  182. _service.Create(data);
  183. } else {
  184. return BadRequest(ModelState);
  185. }
  186. return Ok();
  187. }
  188. /// <summary>
  189. /// 수정
  190. /// </summary>
  191. /// <param name="siteId"></param>
  192. /// <param name="data"></param>
  193. /// <returns></returns>
  194. [HttpPost("{siteId}")]
  195. public IActionResult Edit(int siteId, [FromBody] CmSite data) {
  196. _logger.LogInformation("Edit");
  197. if (siteId != data.SiteId) {
  198. return BadRequest("잘못된 접근입니다.");
  199. }
  200. if (ModelState.IsValid) {
  201. _service.Edit(siteId, data);
  202. } else {
  203. return BadRequest(ModelState);
  204. }
  205. return Ok();
  206. }
  207. /// <summary>
  208. /// 삭제
  209. /// </summary>
  210. [HttpDelete("{siteId}")]
  211. public IActionResult Delete(int siteId) {
  212. _service.Delete(siteId);
  213. return Ok();
  214. }
  215. }
  216. }