WorkScheduleController.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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. namespace FMSAdmin.Controllers {
  17. [Authorize]
  18. [ApiController]
  19. [ApiVersion("1")]
  20. [Route("api/[controller]")]
  21. public class WorkScheduleController : Controller {
  22. private readonly ILogger<WorkScheduleController> _logger;
  23. private readonly FMSContext _context;
  24. private readonly FMSApp.Services.WorkScheduleService _service;
  25. private readonly StorageHelper _storage;
  26. public WorkScheduleController(
  27. ILogger<WorkScheduleController> logger,
  28. FMSContext context,
  29. FMSApp.Services.WorkScheduleService service,
  30. StorageHelper storage
  31. ) {
  32. _logger = logger;
  33. _context = context;
  34. _service = service;
  35. _storage = storage;
  36. }
  37. /// <summary>
  38. /// 정기점검 계획 목록
  39. /// </summary>
  40. [HttpGet("[action]")]
  41. public IActionResult RegularList([FromQuery] PagingRequest req) {
  42. return List(req, 1);
  43. }
  44. /// <summary>
  45. /// 정기점검 계획 목록 Excel
  46. /// </summary>
  47. [AllowAnonymous]
  48. [HttpGet("[action]")]
  49. public IActionResult RegularExcel([FromQuery] PagingRequest req, string filename) {
  50. return ExportExcel(req, 1, filename);
  51. }
  52. /// <summary>
  53. /// 법정점검 계획 목록
  54. /// </summary>
  55. [HttpGet("[action]")]
  56. public IActionResult LegalList([FromQuery] PagingRequest req) {
  57. return List(req, 2);
  58. }
  59. /// <summary>
  60. /// 법정점검 계획 목록 Excel
  61. /// </summary>
  62. [AllowAnonymous]
  63. [HttpGet("[action]")]
  64. public IActionResult LegalExcel([FromQuery] PagingRequest req, string filename) {
  65. return ExportExcel(req, 2, filename);
  66. }
  67. private IQueryable<FmsWorkSchedule> _WorkTypeFilter([FromQuery] PagingRequest req, int workType) {
  68. var query = _FilterAndSort(req);
  69. // 업무분야 필드가 있는경우만 추가
  70. if (workType == 2) {
  71. query = query.Where(x => x.WorkTypeId == 2 || x.WorkTypeId == 7);
  72. } else {
  73. query = query.Where(x => x.WorkTypeId == workType);
  74. }
  75. return query;
  76. }
  77. /// <summary>
  78. /// 목록
  79. /// </summary>
  80. [HttpGet]
  81. public IActionResult List([FromQuery] PagingRequest req, int workType) {
  82. var query = _WorkTypeFilter(req, workType);
  83. var list = _ListSelect(query);
  84. var paging = PagingList.Pagination(list, req.page, req.limit);
  85. return Ok(paging);
  86. }
  87. private dynamic _ListSelect(IQueryable<FmsWorkSchedule> query) {
  88. var list = query.Select(x => new {
  89. x.SiteId,
  90. SiteName = x.CmSite.Name,
  91. x.WorkScheduleId,
  92. x.BusinessFieldId,
  93. BusinessField = x.CmBusinessField.Name,
  94. x.WorkTypeId,
  95. WorkType = x.WorkType.Name,
  96. x.Name,
  97. WorkDueDate = x.WorkDueDate.ToShortDateString(),
  98. x.HolidayWorkTypeId,
  99. HolidayWorkType = x.FmsWorkCodeHolidayWorkType.Name,
  100. x.CycleSize,
  101. x.CycleUnitId,
  102. CycleUnit = x.FmsWorkCodeCycleUnit.Name,
  103. IsAutoOrder = (x.IsAutoOrder ? "Y" : "N"),
  104. IsUse = (x.IsUse ? "Y" : "N"),
  105. x.InspectionAgencyId,
  106. InspectionAgency = x.CmPartner.Name,
  107. x.UpdateUserId,
  108. });
  109. return list;
  110. }
  111. /// <summary>
  112. /// 엑셀파일 익스포트
  113. /// </summary>
  114. /// <param name="req"></param>
  115. /// <returns></returns>
  116. [HttpGet("excel")]
  117. public IActionResult ExportExcel([FromQuery] PagingRequest req, int workType, string filename) {
  118. req.page = 1;
  119. req.limit = 0;
  120. var query = _WorkTypeFilter(req, workType);
  121. var list = _ListSelect(query);
  122. var stream = new MemoryStream();
  123. using (var package = new ExcelPackage(stream)) {
  124. var workSheet = package.Workbook.Worksheets.Add("Sheet1");
  125. workSheet.Cells.LoadFromCollection(list, true);
  126. if (req.columns != null && req.columns.Length > 0) {
  127. workSheet.AddStyle(req.columns, req.sort?.order?.ToLower() == "asc", filename);
  128. }
  129. package.Save();
  130. }
  131. stream.Position = 0;
  132. string excelName = $"excel-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
  133. return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName);
  134. }
  135. [HttpGet("[action]")]
  136. public IActionResult Regular([FromQuery] string siteId, [FromQuery] string workScheduleId) {
  137. return Get(siteId, workScheduleId, 1);
  138. }
  139. [HttpGet("[action]")]
  140. public IActionResult Legal([FromQuery] string siteId, [FromQuery] string workScheduleId) {
  141. return Get(siteId, workScheduleId, 2);
  142. }
  143. private IActionResult Get(string siteId, string workScheduleId, int workTypeId) {
  144. var query = _service.GetAll()
  145. .Where(x => x.SiteId == Util.ToInt(siteId) && x.WorkScheduleId == Util.ToInt(workScheduleId));
  146. var item = query.Select(x => new {
  147. x.SiteId,
  148. x.WorkScheduleId,
  149. x.WorkTypeId,
  150. WorkType = new {
  151. x.WorkType.Name
  152. },
  153. x.BusinessFieldId,
  154. BusinessField = new {
  155. x.CmBusinessField.Name
  156. },
  157. x.InspectionAgencyId,
  158. InspectionAgency = new {
  159. x.CmPartner.Name
  160. },
  161. x.Name,
  162. x.CycleSize,
  163. x.CycleUnitId,
  164. CycleUnit = new {
  165. x.FmsWorkCodeCycleUnit.Name
  166. },
  167. x.HolidayWorkTypeId,
  168. HolidayWorkType = new {
  169. x.FmsWorkCodeHolidayWorkType.Name
  170. },
  171. x.WorkDueDate,
  172. x.UpdateUserId,
  173. UserName = new {
  174. x.CmUser.Name
  175. },
  176. x.IsUse,
  177. x.IsAutoOrder,
  178. x.Content,
  179. FmsWorkScheduleToFacility = x.FmsWorkScheduleToFacility.Select(f => new {
  180. f.SiteId,
  181. f.WorkScheduleId,
  182. f.FacilityCode,
  183. //CmFacility = new {
  184. FacilityName = f.CmFacility.Name,
  185. f.CmFacility.BuildingId,
  186. CmBuilding = new {
  187. f.CmFacility.CmBuilding.Name,
  188. },
  189. f.CmFacility.FloorId,
  190. CmFloor = new {
  191. f.CmFacility.CmFloor.Name,
  192. },
  193. f.CmFacility.FirstClassId,
  194. FirstClassName = f.CmFacility.FmsFacilityCodeClass.Name,
  195. f.CmFacility.SecondClassId,
  196. SecondClassName = f.CmFacility.FmsFacilityCodeClass1.Name,
  197. f.CmFacility.ThirdClassId,
  198. ThirdClassName = f.CmFacility.FmsFacilityCodeClass2.Name,
  199. //},
  200. }).ToList()
  201. }).FirstOrDefault();
  202. return Ok(item);
  203. }
  204. [HttpPost("[action]")]
  205. public IActionResult Save([FromBody] FmsWorkSchedule data) {
  206. _logger.LogInformation("Save");
  207. //_logger.LogInformation(data.Dump());
  208. ModelState.RemoveStartOf("CmFile");
  209. if (ModelState.IsValid) {
  210. _service.SaveExpectedRequest(data);
  211. } else {
  212. return BadRequest(ModelState);
  213. }
  214. return Ok();
  215. }
  216. [HttpDelete("{siteId}/{workScheduleId}")]
  217. public IActionResult Delete(int siteId, int workScheduleId) {
  218. _service.DeleteWithResult(siteId, workScheduleId);
  219. return Ok();
  220. }
  221. // 검색 & 정렬 공통
  222. private IQueryable<FmsWorkSchedule> _FilterAndSort(PagingRequest req) {
  223. var query = _service.GetAll();
  224. // 기본 Entity 검색
  225. query = query.Filter(req.conditions);
  226. // if (req.businessFieldId != null) {
  227. // query = query.Where(x => x.BusinessFieldId == req.businessFieldId || x.CmBusinessField.Name == "공통");
  228. // }
  229. // 업무분야 필드가 있는경우만 추가
  230. if (req.businessFieldId != null) {
  231. query = query.Where(x => x.SiteId == req.siteId);
  232. query = query.Where(x => x.BusinessFieldId == req.businessFieldId || x.CmBusinessField.Name == "공통");
  233. }
  234. if (req.siteId != null) {
  235. query = query.Where(x => x.SiteId == Util.ToInt(req.siteId));
  236. }
  237. // 기본 Entity 정렬
  238. query = query.Sort(req.sort);
  239. return query;
  240. }
  241. [HttpGet("[action]")]
  242. public IActionResult GetScheduleWarning(int siteId, int workScheduleId) {
  243. var retStr = _service.GetUpdateScheduleWarningMessage(siteId, workScheduleId);
  244. return Ok(retStr);
  245. }
  246. }
  247. }