DailyReportController.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  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 FMSApp.Services;
  8. using Microsoft.AspNetCore.Mvc;
  9. using Microsoft.Extensions.Logging;
  10. using Microsoft.AspNetCore.Authorization;
  11. using FMSAdmin.Helpers;
  12. using System.Data;
  13. using System.IO;
  14. using OfficeOpenXml;
  15. using System.Text;
  16. using System.Collections.Generic;
  17. using Newtonsoft.Json;
  18. namespace FMSApp.Controllers {
  19. [Authorize]
  20. [ApiController]
  21. [ApiVersion("1")]
  22. [Route("api/app/[controller]")]
  23. public class DailyReportController : Controller {
  24. private readonly ILogger<DailyReportController> _logger;
  25. private readonly FMSContext _context;
  26. private readonly DailyReportService _service;
  27. private readonly FMSAdmin.Services.SiteWeatherInfoService _siteWeatherInfoService;
  28. private readonly StorageHelper _storage;
  29. public enum WorkTypeId {
  30. PeriodicInspection = 1,
  31. ForensicExamination = 2,
  32. CivilComplaint = 3,
  33. SiAlarm = 4,
  34. Occasional = 5,
  35. Construct = 6,
  36. ForensicEducation = 7,
  37. }
  38. public enum WorkProgressId {
  39. WorkStatusPending = 3,
  40. WorkStatusInProgress = 4,
  41. WorkStatusComplete = 5,
  42. WorkStatusApproved = 6,
  43. WorkStatusDeferred = 7,
  44. }
  45. public enum AdjustmentTypeId {
  46. Regular = 0,
  47. Loss = 1,
  48. Return = 2
  49. }
  50. public DailyReportController(
  51. ILogger<DailyReportController> logger,
  52. FMSContext context,
  53. DailyReportService service,
  54. FMSAdmin.Services.SiteWeatherInfoService siteWeatherInfoService,
  55. StorageHelper storage
  56. ) {
  57. _logger = logger;
  58. _context = context;
  59. _service = service;
  60. _siteWeatherInfoService = siteWeatherInfoService;
  61. _storage = storage;
  62. }
  63. /// <summary>
  64. /// 목록
  65. /// </summary>
  66. [HttpGet]
  67. public IActionResult List([FromQuery] PagingRequest req, [FromQuery] string siteId, bool businessAuth) {
  68. var query = _FilterAndSort(req);
  69. query = BusinessFieldHelper.Apply<FmsDailyReport>(_context, User, businessAuth, query);
  70. query = query.Where(x => x.SiteId == Util.ToInt(siteId));
  71. var list = query.Select(x => new {
  72. x.SiteId,
  73. x.AddDate,
  74. x.BusinessFieldId,
  75. x.Name,
  76. x.Contents,
  77. x.RegisterUserId,
  78. RegisterUserName = _context.CmUser.FirstOrDefault(user => user.UserId == x.RegisterUserId).Name,
  79. x.ApproveDate,
  80. x.RegisterDate,
  81. x.ApproverUserId,
  82. ApproverUserName = _context.CmUser.FirstOrDefault(user => user.UserId == x.ApproverUserId).Name,
  83. });
  84. var paging = PagingList.Pagination(list, req.page, req.limit);
  85. return Ok(paging);
  86. }
  87. [HttpGet("[action]")]
  88. public IActionResult Get([FromQuery] string siteId, [FromQuery] DateTime addDate, [FromQuery] string businessFieldId) {
  89. var query = _service.GetAll();
  90. var item = query.Where(
  91. x => x.SiteId == Util.ToInt(siteId)
  92. && x.AddDate == addDate.Date
  93. && x.BusinessFieldId == Util.ToInt(businessFieldId)
  94. ).Select(x => new {
  95. x.SiteId,
  96. x.AddDate,
  97. x.BusinessFieldId,
  98. x.Name,
  99. x.Contents,
  100. x.Datas,
  101. x.RegisterUserId,
  102. x.RegisterDate,
  103. x.ApproveDate,
  104. x.ApproverUserId,
  105. ApproverUserName = _context.CmUser.FirstOrDefault(user => user.UserId == x.ApproverUserId).Name,
  106. x.ApproverUserId2,
  107. ApproverUserName2 = _context.CmUser.FirstOrDefault(user => user.UserId == x.ApproverUserId2).Name,
  108. x.ApproverUserId3,
  109. ApproverUserName3 = _context.CmUser.FirstOrDefault(user => user.UserId == x.ApproverUserId3).Name,
  110. x.ApproverUserId4,
  111. ApproverUserName4 = _context.CmUser.FirstOrDefault(user => user.UserId == x.ApproverUserId4).Name,
  112. x.ApproverUserId5,
  113. ApproverUserName5 = _context.CmUser.FirstOrDefault(user => user.UserId == x.ApproverUserId5).Name,
  114. CmFile = _storage.ParseFile(x.CmFile),
  115. }).FirstOrDefault();
  116. return Ok(item);
  117. }
  118. [HttpGet("[action]")]
  119. public IActionResult GetCurrentInfo([FromQuery] string siteId, [FromQuery] DateTime addDate, [FromQuery] string businessFieldId) {
  120. var today = addDate.Date;
  121. var yesterday = addDate.Date.AddDays(-1);
  122. var tomorrow = addDate.Date.AddDays(1);
  123. var currentMonthFirstDay = new DateTime(addDate.Year, addDate.Month, 1);
  124. // var prevMonthFirstDay = new DateTime(addDate.Year, addDate.Month - 1, 1);
  125. var prevMonthFirstDay = addDate.Date.AddMonths(-1).AddDays(1 - addDate.Day);
  126. var site = _context.CmSite.FirstOrDefault(x => x.SiteId == Util.ToInt(siteId));
  127. var sido = _siteWeatherInfoService.ReplaceSido(site.ApiSido ?? "");
  128. var sigun = site.ApiSigun ?? "";
  129. var weatherDateTime = new DateTime(addDate.Year, addDate.Month, addDate.Day, 10, 0, 0);
  130. SiteWeatherInfo weather = null;
  131. if (!string.IsNullOrEmpty(sido) && !string.IsNullOrEmpty(sigun)) {
  132. weather = _context.SiteWeatherInfo.Where(
  133. x => x.Sido == sido
  134. && x.Sigun == sigun
  135. && x.BaseTime >= weatherDateTime
  136. && x.BaseTime < weatherDateTime.Date.AddDays(1)
  137. ).OrderBy(x => x.BaseTime).FirstOrDefault();
  138. }
  139. /*
  140. var workStatus = new Dictionary<string, int> {
  141. ["WorkStatusTypePeriodicInspection"] = _service.GetWorkStatusByWorkTypeId(Util.ToInt(siteId), (int)WorkTypeId.PeriodicInspection, addDate),
  142. ["WorkStatusTypeForensicExamination"] = _service.GetWorkStatusByWorkTypeId(Util.ToInt(siteId), (int)WorkTypeId.ForensicExamination, addDate),
  143. ["WorkStatusTypeForensicEducation"] = _service.GetWorkStatusByWorkTypeId(Util.ToInt(siteId), (int)WorkTypeId.ForensicEducation, addDate),
  144. ["WorkStatusTypeOccasional"] = _service.GetWorkStatusByWorkTypeId(Util.ToInt(siteId), (int)WorkTypeId.Occasional, addDate),
  145. ["WorkStatusTypeConstruct"] = _service.GetWorkStatusByWorkTypeId(Util.ToInt(siteId), (int)WorkTypeId.Construct, addDate),
  146. ["WorkStatusTypeEtc"] = _service.GetWorkStatusByWorkTypeId(Util.ToInt(siteId), (int)WorkTypeId.SiAlarm, addDate)
  147. + _service.GetWorkStatusByWorkTypeId(Util.ToInt(siteId), (int)WorkTypeId.CivilComplaint, addDate),
  148. ["WorkStatusPending"] = _service.GetWorkStatusByWorkProgressId(Util.ToInt(siteId), (int)WorkProgressId.WorkStatusPending, addDate),
  149. ["WorkStatusInProgress"] = _service.GetWorkStatusByWorkProgressId(Util.ToInt(siteId), (int)WorkProgressId.WorkStatusInProgress, addDate),
  150. ["WorkStatusDeferred"] = _service.GetWorkStatusByWorkProgressId(Util.ToInt(siteId), (int)WorkProgressId.WorkStatusDeferred, addDate),
  151. ["WorkStatusComplete"] = _service.GetFmsWorkResultComplete(Util.ToInt(siteId), (int)WorkProgressId.WorkStatusComplete, addDate),
  152. ["WorkStatusApproved"] = _service.GetFmsWorkResultApproval(Util.ToInt(siteId), (int)WorkProgressId.WorkStatusApproved, addDate),
  153. };
  154. workStatus["WorkStatusTypeTotal"] = workStatus["WorkStatusTypeOccasional"]
  155. + workStatus["WorkStatusTypePeriodicInspection"]
  156. + workStatus["WorkStatusTypeForensicExamination"]
  157. + workStatus["WorkStatusTypeEtc"];
  158. workStatus["WorkStatusTotal"] = workStatus["WorkStatusPending"]
  159. + workStatus["WorkStatusInProgress"]
  160. + workStatus["WorkStatusDeferred"]
  161. + workStatus["WorkStatusComplete"]
  162. + workStatus["WorkStatusApproved"];
  163. */
  164. _logger.LogInformation("========================== 에너지! =======================");
  165. var energies = _context.BemsFormula.Where(
  166. x => x.SiteId == Util.ToInt(siteId)
  167. && x.FormulaId == 1
  168. && (new int[] { 100, 101, 102, 104, 105, 106 }).Contains(x.FacilityTypeId)
  169. ).Select(x => new {
  170. x.FacilityTypeId,
  171. FacilityTypeName = _context.BemsFacilityType.FirstOrDefault(ft => ft.FacilityTypeId == x.FacilityTypeId).Name,
  172. x.FacilityCode,
  173. List = x.BemsFormulaParameter.Select(p => new {
  174. Parameter = new {
  175. p.ParameterFacilityCode,
  176. p.ParameterPropertyId,
  177. p.FormulaId,
  178. p.ParameterId,
  179. },
  180. MonitoringPoint = _context.BemsMonitoringPoint.Where(
  181. mp => mp.SiteId == p.SiteId
  182. && mp.FacilityCode == p.ParameterFacilityCode
  183. && mp.PropertyId == p.ParameterPropertyId
  184. ).Select(mp => new {
  185. mp.FuelTypeId,
  186. mp.Name,
  187. // 당일(15minRaw 에서 해당 일자의 마지막 검침값)
  188. Today = mp.BemsMonitoringPointHistory15minRawData.Where(
  189. raw => raw.CreatedDateTime >= today && raw.CreatedDateTime < tomorrow
  190. ).OrderByDescending(raw => raw.CreatedDateTime).FirstOrDefault().CurrentValue,
  191. // 전일(15minRaw 에서 해당 일자 전날의 마지막 검침값)
  192. DayBefore = mp.BemsMonitoringPointHistory15minRawData.Where(
  193. raw => raw.CreatedDateTime >= yesterday && raw.CreatedDateTime < today
  194. ).OrderByDescending(raw => raw.CreatedDateTime).FirstOrDefault().CurrentValue,
  195. // 당일
  196. DailyUsage = mp.BemsMonitoringPointHistoryDaily.Where(
  197. usage => usage.CreatedDateTime.Date == today.Date
  198. ).FirstOrDefault().DailyValue,
  199. //당월
  200. MonthUsage = mp.BemsMonitoringPointHistoryDaily.Where(
  201. usage => usage.CreatedDateTime.Date >= currentMonthFirstDay.Date && usage.CreatedDateTime < tomorrow
  202. ).Sum(usage => usage.DailyValue)
  203. }).FirstOrDefault()
  204. }).Where(p => !p.MonitoringPoint.Name.Contains("과거")).ToList()
  205. }).ToList();
  206. _logger.LogInformation("========================== 작업내역 =======================");
  207. var works = _context.CmBusinessField.Where(
  208. x => x.IsUse == true
  209. ).OrderBy(x => x.BusinessFieldId).Select(x => new {
  210. x.BusinessFieldId,
  211. BusinessFieldName = x.Name,
  212. /* 기존 Bems 소스 그대로 가져 넣음... where 절의 and 와 or 가 난해함... 의도한건지 정확하지 않음. */
  213. List = (from req in _context.FmsWorkRequest
  214. let res = from res in _context.FmsWorkResult
  215. where
  216. res.SiteId == Util.ToInt(siteId) && ((res.IsConfirmed == false && (res.StartDate <= addDate.Date)) ||
  217. (res.ConfirmedDate.Value.Year == addDate.Year &&
  218. res.ConfirmedDate.Value.Month == addDate.Month &&
  219. res.ConfirmedDate.Value.Day == addDate.Day))
  220. select res.WorkRequestId
  221. where
  222. req.SiteId == Util.ToInt(siteId) && (
  223. (res.Contains(req.WorkRequestId) && req.BusinessFieldId == x.BusinessFieldId)
  224. || (req.WorkProgressId <= 5 && req.WorkProgressId >= 4 && req.BusinessFieldId == x.BusinessFieldId)
  225. && (req.StartWorkDate <= addDate.Date))
  226. orderby req.RequestDate, req.WorkProgressId ascending
  227. select new {
  228. WorkRequestId = req.WorkRequestId,
  229. BusinessFieldId = req.BusinessFieldId,
  230. WorkProgressId = req.WorkProgressId,
  231. WorkProgressName = req.WorkProgress.Name,
  232. WorkTypeId = req.WorkTypeId,
  233. WorkTypeName = req.WorkType.Name,
  234. RequestDate = req.RequestDate,
  235. Title = req.Title,
  236. WorkUsers = req.WorkUsers,
  237. WorkPartnerId = req.WorkPartnerId,
  238. WorkPartnerName = req.WorkPartner.Name,
  239. req.FmsWorkResult.StartDate,
  240. req.FmsWorkResult.EndDate,
  241. CheckItems = _context.FmsWorkResultCheckItem.Where(
  242. check => check.SiteId == req.SiteId
  243. && check.WorkRequestId == req.WorkRequestId
  244. ).OrderBy(check => check.CheckItemId).Select(check => new {
  245. check.CheckDate,
  246. check.TextResult,
  247. }).ToList()
  248. }).ToList()
  249. }).ToList();
  250. _logger.LogInformation("========================== 작업현황 =======================");
  251. /*
  252. var workCounts = _context.CmBusinessField.Where(
  253. x => x.IsUse == true
  254. ).OrderBy(x => x.BusinessFieldId).Select(x => new {
  255. x.BusinessFieldId,
  256. BusinessFieldName = x.Name,
  257. RequestCount = _context.FmsWorkRequest.Where(
  258. req => req.SiteId == Util.ToInt(siteId)
  259. && req.StartWorkDate.Date == addDate.Date
  260. && req.BusinessFieldId == x.BusinessFieldId
  261. ).Count(),
  262. ApprovalCount = _context.FmsWorkResult.Where(
  263. res => res.SiteId == Util.ToInt(siteId)
  264. && res.FmsWorkRequest.StartWorkDate.Date == addDate.Date
  265. && res.FmsWorkRequest.WorkProgressId == 6
  266. && res.FmsWorkRequest.BusinessFieldId == x.BusinessFieldId
  267. ).Count()
  268. }).ToList();
  269. */
  270. var workCounts = works.Select(x => new {
  271. x.BusinessFieldId,
  272. x.BusinessFieldName,
  273. RequestCount = x.List.Count,
  274. ApprovalCount = x.List.Where(x => x.WorkProgressId == 6).Count()
  275. }).ToList();
  276. var materials = _context.CmBusinessField.Where(
  277. x => x.IsUse == true
  278. ).OrderBy(x => x.BusinessFieldId).Select(x => new {
  279. x.BusinessFieldId,
  280. BusinessFieldName = x.Name,
  281. List = _context.FmsMaterialRelease.Where(
  282. release => release.SiteId == Util.ToInt(siteId)
  283. && release.ReleaseDate.Date == addDate.Date
  284. && release.BusinessFieldId == x.BusinessFieldId
  285. && (release.AdjustmentTypeId == 0 || release.AdjustmentTypeId == 1)
  286. ).OrderBy(release => release.ReleaseDate).Select(release => new {
  287. ReleaseTypeName = release.ReleaseType.Name,
  288. FirstClassId = release.FmsMaterial.FirstClassId,
  289. FirstClassName = release.FmsMaterial.FmsMaterialCodeClass.Name,
  290. SecondClassId = release.FmsMaterial.SecondClassId,
  291. SecondClassName = release.FmsMaterial.FmsMaterialCodeClass1.Name,
  292. ThirdClassId = release.FmsMaterial.ThirdClassId,
  293. ThirdClassName = release.FmsMaterial.FmsMaterialCodeClass2.Name,
  294. MaterialName = release.FmsMaterial.Name,
  295. Standard = release.FmsMaterial.Standard,
  296. WorkName = release.FmsWorkResult.FmsWorkOrder.Title,
  297. Unit = release.FmsMaterial.Unit,
  298. MaterialCount = (int)release.MaterialCount,
  299. WorkerName = release.FmsWorkResult.CmUser.Name
  300. }).ToList()
  301. }).ToList();
  302. var accidents = _context.FmsAccident.Where(
  303. x => x.SiteId == Util.ToInt(siteId)
  304. && x.StartDate >= today
  305. && x.StartDate < tomorrow
  306. ).OrderBy(x => x.AccidentId).Select(x => new {
  307. x.AccidentTypeId,
  308. AccidentTypeName = x.FmsAccidentCodeType.Name,
  309. x.AccidentId,
  310. x.Name,
  311. x.DepartmentId,
  312. DepartmentName = x.CmDepartment.Name,
  313. x.StartDate,
  314. x.EndDate,
  315. }).ToList();
  316. var complaints = _context.FmsComplaints.Where(
  317. x => x.SiteId == Util.ToInt(siteId)
  318. && x.StartDate >= today
  319. && x.StartDate < tomorrow
  320. ).OrderBy(x => x.ComplaintId).Select(x => new {
  321. x.ComplaintTypeId,
  322. ComplaintTypeName = x.FmsComplaintCodeType.Name,
  323. x.ComplaintId,
  324. x.Name,
  325. x.DepartmentId,
  326. DepartmentName = x.CmDepartment.Name,
  327. x.StartDate,
  328. x.EndDate,
  329. }).ToList();
  330. var alarms = _context.FmsAlarmLog.Where(
  331. x => x.SiteId == Util.ToInt(siteId)
  332. && x.CreatedDateTime >= today
  333. && x.CreatedDateTime < tomorrow
  334. && x.CurrentValue != 0
  335. ).OrderBy(x => x.CreatedDateTime).Select(x => new {
  336. x.FacilityTypeId,
  337. FacilityTypeName = x.AlarmPoint.FacilityType.Name,
  338. x.FacilityCode,
  339. x.PropertyId,
  340. MonitoringPointName = x.AlarmPoint.BemsMonitoringPoint.Name,
  341. FacilityName = x.AlarmPoint.Facility.Name,
  342. CreatedDateTime = x.CreatedDateTime.ToString("yyyy-MM-dd HH:mm"),
  343. x.CurrentValue,
  344. }).ToList();
  345. return Ok(new {
  346. Weather = weather,
  347. Energies = energies,
  348. Works = works,
  349. WorkCounts = workCounts,
  350. Materials = materials,
  351. Accidents = accidents,
  352. Complaints = complaints,
  353. Alarms = alarms,
  354. });
  355. }
  356. /// <summary>
  357. /// 저장
  358. /// </summary>
  359. /// <param name="data"></param>
  360. /// <returns></returns>
  361. [HttpPost("[action]")]
  362. public IActionResult Save([FromBody] FmsDailyReport data, [FromQuery] bool isCreate) {
  363. _logger.LogInformation($"Save isCreate({isCreate})");
  364. //_logger.LogInformation(data.Dump());
  365. if (ModelState.IsValid) {
  366. _service.Save(data, isCreate);
  367. } else {
  368. return BadRequest(ModelState);
  369. }
  370. return Ok();
  371. }
  372. [HttpPost("[action]")]
  373. public IActionResult Approve([FromQuery] string siteId, [FromQuery] string approverUserId, [FromQuery] DateTime addDate, [FromQuery] string businessFieldId) {
  374. _service.Approve(Util.ToInt(siteId), approverUserId, addDate, Util.ToInt(businessFieldId));
  375. return Ok();
  376. }
  377. // 검색 & 정렬 공통
  378. private IQueryable<FmsDailyReport> _FilterAndSort(PagingRequest req) {
  379. var query = _service.GetAll();
  380. // 기본 Entity 검색
  381. query = query.Filter(req.conditions);
  382. // 기본 Entity 정렬
  383. query = query.Sort(req.sort);
  384. return query;
  385. }
  386. [HttpDelete("[action]")]
  387. public IActionResult Delete([FromQuery] string siteId, [FromQuery] DateTime addDate, [FromQuery] string businessFieldId) {
  388. _service.Delete(Util.ToInt(siteId), addDate, Util.ToInt(businessFieldId));
  389. return Ok();
  390. }
  391. [AllowAnonymous]
  392. [HttpGet("[action]")]
  393. public string GetJson([FromQuery] string siteId, [FromQuery] DateTime addDate) {
  394. var query = _service.GetAll();
  395. var item = query.Where(
  396. x => x.SiteId == Util.ToInt(siteId)
  397. && x.AddDate.Date == addDate.Date
  398. ).Select(x => new {
  399. CmSite = new {
  400. x.Site.Name
  401. },
  402. AddDate = x.AddDate.ToString("yyyy-MM-dd"),
  403. x.Name,
  404. x.Contents,
  405. x.Datas,
  406. x.ApproveDate,
  407. x.ApproveDate2,
  408. x.ApproveDate3,
  409. x.ApproverUserId,
  410. x.ApproverUserId2,
  411. x.ApproverUserId3
  412. }).FirstOrDefault();
  413. string approve = "";
  414. if (item != null) {
  415. approve += "[" + getApproverInfo(item.ApproverUserId, item.ApproveDate);
  416. approve += getApproverInfo(item.ApproverUserId2, item.ApproveDate2);
  417. approve += getApproverInfo(item.ApproverUserId3, item.ApproveDate3);
  418. approve += "]";
  419. }
  420. string json = "";
  421. if (item != null)
  422. json = $@"
  423. {{
  424. SiteNm : ""{item.CmSite.Name}"",
  425. Datas: {item.Datas},
  426. Approver : {approve}
  427. }}";
  428. return json;
  429. }
  430. public string getApproverInfo(string id, DateTime? date) {
  431. if (!Util.IsNullOrEmpty(id)) {
  432. var userInfo = _context.CmUser.Where(x => x.UserId == id).Select(x => new {
  433. GroupNm = x.CmUserGroup.Name,
  434. Date = date.Value.ToString("yyyy-MM-dd"),
  435. image = x.CmFile1 != null ? _storage.GetFullUrl(x.CmFile1.Path) + _storage.getFilePath(x.CmFile1) : ""
  436. }).SingleOrDefault();
  437. return JsonConvert.SerializeObject(userInfo) + ",";
  438. } else return "";
  439. }
  440. }
  441. }