HolidayController.cs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  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 HolidayController : Controller {
  26. private readonly ILogger<HolidayController> _logger;
  27. private readonly FMSContext _context;
  28. private readonly HolidayService _service;
  29. private readonly StorageHelper _storage;
  30. private readonly MonthWorkService _serviceMonthWork;
  31. public HolidayController(
  32. ILogger<HolidayController> logger,
  33. FMSContext context,
  34. HolidayService service,
  35. MonthWorkService serviceMonthWork,
  36. StorageHelper storage
  37. ) {
  38. _logger = logger;
  39. _context = context;
  40. _service = service;
  41. _storage = storage;
  42. _serviceMonthWork = serviceMonthWork;
  43. }
  44. /// <summary>
  45. /// 목록
  46. /// </summary>
  47. [HttpGet("[action]")]
  48. public IActionResult ListCalendar(int siteId, int? year, int? month) {
  49. DateTime selectMonth;
  50. if (year == null || month == null) {
  51. selectMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
  52. } else {
  53. selectMonth = new DateTime(year.Value, month.Value, 1);
  54. }
  55. var startDate = selectMonth.AddDays(-7);
  56. var endDate = selectMonth.AddDays(37);
  57. // 휴일
  58. var holidayList = _GetHolidayList(siteId, selectMonth.Year, selectMonth.Month, startDate, endDate);
  59. // 주말
  60. var weekend = _context.CmHolidayWeekend.Where(
  61. x => x.SiteId == siteId
  62. && x.IsUse == true
  63. ).FirstOrDefault();
  64. if (weekend != null) {
  65. }
  66. // 주별 중점업무
  67. var weekList = _GetWeekKeyWorkEventList(siteId, startDate, endDate);
  68. var workName = _serviceMonthWork.GetKeyWork(siteId, selectMonth.Month);
  69. var result = new {
  70. Year = selectMonth.Year,
  71. Month = selectMonth.Month,
  72. Theme = workName,
  73. StartDate = startDate.ToString("yyyy-MM-dd"),
  74. EndDate = endDate.ToString("yyyy-MM-dd"),
  75. HolidayList = holidayList,
  76. Saturday = weekend?.Saturday ?? false,
  77. Sunday = weekend?.Sunday ?? false,
  78. WeekList = weekList
  79. };
  80. return Ok(result);
  81. }
  82. /// <summary>
  83. /// 휴일 조회 (정기/특정)
  84. /// </summary>
  85. [HttpGet("{siteId}/{type}/{id}")]
  86. public IActionResult Get(int siteId, string type, string id) {
  87. if (type == "H") { //정기
  88. var array = id.Split('-');
  89. int month = Util.ToInt(array[0]);
  90. int day = Util.ToInt(array[1]);
  91. var data = _service.Gets(month, day, siteId);
  92. if (data.Count() == 0) {
  93. return NotFound("휴일 정보를 찾을 수 없습니다.");
  94. }
  95. var item = data.Select(x => new {
  96. x.SiteId,
  97. SiteName = x.Site.Name,
  98. CmSite = new {
  99. x.Site.Name,
  100. },
  101. x.HolidayMonth,
  102. x.HolidayDay,
  103. x.IsLunar,
  104. x.Name,
  105. HolidayType = "H",
  106. isHolidayType = true,
  107. x.IsUse
  108. });
  109. return Ok(item.First());
  110. } else if (type == "C") { //특정
  111. var data = _service.CustomGets(id, siteId);
  112. if (data.Count() == 0) {
  113. return NotFound("휴일 정보를 찾을 수 없습니다.");
  114. }
  115. var item = data.Select(x => new {
  116. x.SiteId,
  117. SiteName = x.Site.Name,
  118. CmSite = new {
  119. x.Site.Name,
  120. },
  121. x.HolidayDate,
  122. x.Name,
  123. HolidayType = "C",
  124. isHolidayType = false,
  125. x.IsUse
  126. });
  127. return Ok(item.First());
  128. } else {
  129. return Ok();
  130. }
  131. }
  132. /// <summary>
  133. /// 등록
  134. /// </summary>
  135. [HttpPut("{dates}")]
  136. public IActionResult Create(string dates, [FromBody] CmHoliday data) {
  137. _logger.LogInformation("Create");
  138. //_logger.LogInformation(data.Dump());
  139. if (ModelState.IsValid) {
  140. _service.Create(dates, data);
  141. } else {
  142. return BadRequest(ModelState);
  143. }
  144. return Ok();
  145. }
  146. /// <summary>
  147. /// 수정
  148. /// </summary>
  149. [HttpPost("{siteId}/{id}")]
  150. public IActionResult Edit(int siteId, string id, [FromBody] CmHoliday data) {
  151. string[] arrId = id.Split('-');
  152. if (Util.ToInt(arrId[0]) != data.HolidayMonth || Util.ToInt(arrId[1]) != data.HolidayDay) {
  153. return BadRequest("잘못된 접근입니다.");
  154. }
  155. if (ModelState.IsValid) {
  156. _service.Edit(Util.ToInt(arrId[0]), Util.ToInt(arrId[1]), siteId, data);
  157. } else {
  158. return BadRequest(ModelState);
  159. }
  160. return Ok();
  161. }
  162. /// <summary>
  163. /// 삭제
  164. /// </summary>
  165. [HttpDelete("{siteId}/{dates}")]
  166. public IActionResult Delete(int siteId, string dates) {
  167. _service.Delete(dates, siteId);
  168. return Ok();
  169. }
  170. private IList<CalendarBackground> _GetHolidayList(int siteId, int year, int month, DateTime startDate, DateTime endDate) {
  171. var list = new List<CalendarBackground>();
  172. var holiday = _context.CmHoliday.Where(
  173. x => x.SiteId == siteId
  174. && x.IsUse == true
  175. ).ToList();
  176. foreach (var item in holiday) {
  177. DateTime dt;
  178. if (!DateTime.TryParse(year.ToString() + "-" + item.HolidayMonth.ToString("D2") + "-" + item.HolidayDay.ToString("D2"), out dt)) {
  179. continue;
  180. }
  181. if (item.IsLunar) {
  182. var solar = LunarSolarConverter.LunarToSolar(new Lunar() {
  183. lunarYear = year,
  184. lunarMonth = item.HolidayMonth,
  185. lunarDay = item.HolidayDay
  186. });
  187. list.Add(new CalendarBackground {
  188. Id = "H-" + item.SiteId + "-" + item.HolidayMonth.ToString() + "-" + item.HolidayDay.ToString(),
  189. Title = item.Name + "(음력)",
  190. Date = new DateTime(solar.solarYear, solar.solarMonth, solar.solarDay).ToString("yyyy-MM-dd"),
  191. SunDate = new DateTime(year, item.HolidayMonth, item.HolidayDay).ToString("yyyy-MM-dd"),
  192. Type = "H",
  193. IsLunar = item.IsLunar,
  194. });
  195. } else {
  196. list.Add(new CalendarBackground {
  197. Id = "H-" + item.SiteId + "-" + item.HolidayMonth.ToString() + "-" + item.HolidayDay.ToString(),
  198. Title = item.Name,
  199. Date = new DateTime(year, item.HolidayMonth, item.HolidayDay).ToString("yyyy-MM-dd"),
  200. Type = "H",
  201. IsLunar = false,
  202. });
  203. }
  204. }
  205. var holiday2 = _context.CmHolidayCustom.Where(x => x.SiteId == siteId && x.HolidayDate.Date >= startDate.Date && x.HolidayDate <= endDate.Date).ToList();
  206. foreach (var item in holiday2) {
  207. list.Add(new CalendarBackground {
  208. Id = "C-" + item.SiteId + "-" + item.HolidayDate.ToString("yyyyMMdd"),
  209. Title = item.Name,
  210. Date = item.HolidayDate.ToString("yyyy-MM-dd"),
  211. Type = "C",
  212. });
  213. }
  214. return list;
  215. }
  216. private IQueryable<CalendarEvent> _GetWeekKeyWorkEventList(int? siteId, DateTime startDate, DateTime endDate) {
  217. var query = _context.FmsWeekKeyWork.Select(x => x);
  218. if (siteId != null) {
  219. query = query.Where(x => x.SiteId == siteId.Value);
  220. }
  221. query = query.Where(x => x.WorkDate.Date >= startDate.Date && x.WorkDate.Date <= endDate.Date);
  222. var list = query.Select(x => new CalendarEvent {
  223. Title = x.WorkName,
  224. Start = x.WorkDate.ToString("yyyy-MM-dd"),
  225. End = x.WorkDate.AddDays(7).ToString("yyyy-MM-dd"),
  226. WorkType = "주별중점업무",
  227. Type = "주별 중점업무",
  228. WorkRequestId = x.WeekKeyWorkId,
  229. SiteId = x.SiteId,
  230. });
  231. return list;
  232. }
  233. }
  234. }