FacilityStateController.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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 FacilityStateController : Controller {
  26. private readonly ILogger<FacilityStateController> _logger;
  27. private readonly FMSContext _context;
  28. private readonly FacilityStateService _service;
  29. private readonly StorageHelper _storage;
  30. public FacilityStateController(
  31. ILogger<FacilityStateController> logger,
  32. FMSContext context,
  33. FacilityStateService service,
  34. StorageHelper storage
  35. ) {
  36. _logger = logger;
  37. _context = context;
  38. _service = service;
  39. _storage = storage;
  40. }
  41. /// <summary>
  42. /// 목록
  43. /// </summary>
  44. [HttpGet]
  45. public IActionResult List([FromQuery] PagingRequest req) {
  46. var query = _FilterAndSort(req);
  47. var list = _ListSelect(query);
  48. var paging = PagingList.Pagination(list, req.page, req.limit);
  49. return Ok(paging);
  50. }
  51. [HttpGet("{id}")]
  52. public IActionResult Get(int id) {
  53. var data = _service.Get(id);
  54. if (data.Count() == 0) {
  55. return NotFound("정보를 찾을 수 없습니다.");
  56. }
  57. DateTime dt = DateTime.Today;
  58. var list = data.Select(x => new {
  59. x.FacilityStateId,
  60. x.Title,
  61. x.StartDate,
  62. x.EndDate,
  63. x.Note,
  64. StateType = x.StartDate > dt ? 1 : (x.StartDate <= dt && x.EndDate >= dt ? 2 : 3),
  65. StateTypeName = x.StartDate > dt ? "준비중" : (x.StartDate <= dt && x.EndDate >= dt ? "진행중" : "완료"),
  66. FmsFacilityStateDetailList = x.FmsFacilityStateDetail.Select(f => new {
  67. rownum = f.Type == 1 ? f.QuestionId.ToString() : f.CmSite.Name,
  68. f.FacilityStateDetailId,
  69. f.FacilityStateId,
  70. f.QuestionId,
  71. f.Type,
  72. f.SiteId,
  73. SiteName = f.CmSite.Name,
  74. SiteSort = f.CmSite.SortOrderNo,
  75. f.Content,
  76. }).OrderBy(f => f.QuestionId).ThenBy(f => f.Type).ThenBy(f => f.SiteSort).ToList(),
  77. });
  78. return Ok(list.First());
  79. }
  80. [HttpGet("{id}/{siteId}")]
  81. public IActionResult GetReply(int id, int siteId) {
  82. var data = _service.Get(id);
  83. if (data.Count() == 0) {
  84. return NotFound("정보를 찾을 수 없습니다.");
  85. }
  86. DateTime dt = DateTime.Today;
  87. var list = data.Select(x => new {
  88. x.FacilityStateId,
  89. x.Title,
  90. x.StartDate,
  91. x.EndDate,
  92. x.Note,
  93. StateType = x.StartDate > dt ? 1 : (x.StartDate <= dt && x.EndDate >= dt ? 2 : 3),
  94. StateTypeName = x.StartDate > dt ? "준비중" : (x.StartDate <= dt && x.EndDate >= dt ? "진행중" : "완료"),
  95. FmsFacilityStateDetailList = x.FmsFacilityStateDetail.Where(f => f.Type == 1 || (f.Type == 2 && f.SiteId == siteId)).Select(f => new {
  96. rownum = f.Type == 1 ? f.QuestionId.ToString() : "답변",
  97. f.FacilityStateDetailId,
  98. f.FacilityStateId,
  99. f.QuestionId,
  100. f.Type,
  101. f.SiteId,
  102. SiteName = f.CmSite.Name,
  103. SiteSort = f.CmSite.SortOrderNo,
  104. f.Content,
  105. }).OrderBy(f => f.QuestionId).ThenBy(f => f.Type).ThenBy(f => f.SiteSort).ToList(),
  106. });
  107. return Ok(list.First());
  108. }
  109. /// <summary>
  110. /// 엑셀파일 익스포트
  111. /// </summary>
  112. /// <param name="req"></param>
  113. /// <returns></returns>
  114. [HttpGet("excel")]
  115. public IActionResult ExportExcel([FromQuery] PagingRequest req, string filename) {
  116. int id = 0;
  117. if (req.conditions != null) {
  118. foreach (var item in req.conditions) {
  119. if (item.field == "FamilityStateId") {
  120. id = Util.ToInt(item.value);
  121. break;
  122. }
  123. }
  124. }
  125. var query = _service.GetDetail(id);
  126. query = query.OrderBy(x => x.QuestionId).ThenBy(x => x.Type).ThenBy(x => x.CmSite.SortOrderNo);
  127. var list = query.Select(x => new {
  128. rownum = x.Type == 1 ? x.QuestionId.ToString() : x.CmSite.Name,
  129. x.FacilityStateDetailId,
  130. x.FacilityStateId,
  131. x.QuestionId,
  132. x.Type,
  133. x.SiteId,
  134. SiteName = x.CmSite.Name,
  135. x.Content,
  136. });
  137. var stream = new MemoryStream();
  138. using (var package = new ExcelPackage(stream)) {
  139. var workSheet = package.Workbook.Worksheets.Add("Sheet1");
  140. workSheet.Cells.LoadFromCollection(list, true);
  141. if (req.columns != null && req.columns.Length > 0) {
  142. workSheet.AddStyle(req.columns, req.sort != null ? req.sort.order.ToLower() == "asc" : true, filename);
  143. }
  144. package.Save();
  145. }
  146. stream.Position = 0;
  147. string excelName = $"excel-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
  148. return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName);
  149. }
  150. /// <summary>
  151. /// 등록
  152. /// </summary>
  153. [HttpPut()]
  154. public IActionResult Create([FromBody] FmsFacilityState data) {
  155. _logger.LogInformation("Create");
  156. //_logger.LogInformation(data.Dump());
  157. if (ModelState.IsValid) {
  158. _service.Create(data);
  159. } else {
  160. return BadRequest(ModelState);
  161. }
  162. return Ok();
  163. }
  164. /// <summary>
  165. /// 수정
  166. /// </summary>
  167. [HttpPost("{id}")]
  168. public IActionResult Edit(int id, [FromBody] FmsFacilityState data) {
  169. if (id != data.FacilityStateId) {
  170. return BadRequest("잘못된 접근입니다.");
  171. }
  172. if (ModelState.IsValid) {
  173. _service.Edit(id, data);
  174. } else {
  175. return BadRequest(ModelState);
  176. }
  177. return Ok();
  178. }
  179. /// <summary>
  180. /// 답변
  181. /// </summary>
  182. [HttpPost("{id}/{siteId}")]
  183. public IActionResult Reply(int id, int siteId, [FromBody] FmsFacilityState data) {
  184. if (id != data.FacilityStateId) {
  185. return BadRequest("잘못된 접근입니다.");
  186. }
  187. if (ModelState.IsValid) {
  188. _service.Reply(id, siteId, data);
  189. } else {
  190. return BadRequest(ModelState);
  191. }
  192. return Ok();
  193. }
  194. /// <summary>
  195. /// 삭제
  196. /// </summary>
  197. /// <returns></returns>
  198. [HttpDelete("{id}")]
  199. public IActionResult Delete(int id) {
  200. _service.Delete(id);
  201. return Ok();
  202. }
  203. private dynamic _ListSelect(IQueryable<FmsFacilityState> query) {
  204. DateTime dt = DateTime.Today;
  205. var list = query.Select(x => new {
  206. x.FacilityStateId,
  207. x.Title,
  208. StartDate = x.StartDate.ToString("yyyy-MM-dd"),
  209. EndDate = x.EndDate.ToString("yyyy-MM-dd"),
  210. StateType = x.StartDate > dt ? 1 : (x.StartDate <= dt && x.EndDate >= dt ? 2 : 3),
  211. StateTypeName = x.StartDate > dt ? "준비중" : (x.StartDate <= dt && x.EndDate >= dt ? "진행중" : "완료"),
  212. });
  213. return list;
  214. }
  215. // 검색 & 정렬 공통
  216. private IQueryable<FmsFacilityState> _FilterAndSort(PagingRequest req) {
  217. var query = _service.GetAll();
  218. // 기본 Entity 검색
  219. query = query.Filter(req.conditions);
  220. //진행상태 검색
  221. if (req.conditions != null) {
  222. foreach (var item in req.conditions) {
  223. if (item.field == "StateType") {
  224. DateTime dt = DateTime.Today;
  225. if (item.value == "1") {
  226. query = query.Where(x => x.StartDate > dt);
  227. } else if (item.value == "2") {
  228. query = query.Where(x => x.StartDate <= dt && x.EndDate >= dt);
  229. } else if (item.value == "3") {
  230. query = query.Where(x => x.EndDate < dt);
  231. }
  232. }
  233. }
  234. }
  235. // 기본 Entity 정렬
  236. query = query.Sort(req.sort);
  237. return query;
  238. }
  239. }
  240. }