WorkResultController.cs 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545
  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 FMSAdmin.Services;
  9. using Microsoft.AspNetCore.Mvc;
  10. using Microsoft.Extensions.Logging;
  11. using Microsoft.AspNetCore.Authorization;
  12. using FMSAdmin.Helpers;
  13. using System.Data;
  14. using System.IO;
  15. using OfficeOpenXml;
  16. using System.Collections.Generic;
  17. using LinqKit;
  18. namespace FMSAdmin.Controllers {
  19. [Authorize]
  20. [ApiController]
  21. [ApiVersion("1")]
  22. [Route("api/[controller]")]
  23. public class WorkResultController : Controller {
  24. private readonly ILogger<WorkResultController> _logger;
  25. private readonly FMSContext _context;
  26. private readonly WorkResultService _service;
  27. private readonly WorkScheduleService _scheduleService;
  28. private readonly WorkResultToFacilityService _service_2;
  29. private readonly WorkRequestService _requestService;
  30. private readonly MonthWorkService _monthWorkService;
  31. private readonly WeekWorkService _weekWorkService;
  32. private readonly StorageHelper _storage;
  33. public WorkResultController(
  34. ILogger<WorkResultController> logger,
  35. FMSContext context,
  36. WorkResultService service,
  37. WorkResultToFacilityService service_2,
  38. WorkRequestService requestService,
  39. WorkScheduleService scheduleService,
  40. MonthWorkService monthWorkService,
  41. WeekWorkService weekWorkService,
  42. StorageHelper storage
  43. ) {
  44. _logger = logger;
  45. _context = context;
  46. _service = service;
  47. _service_2 = service_2;
  48. _scheduleService = scheduleService;
  49. _requestService = requestService;
  50. _storage = storage;
  51. _monthWorkService = monthWorkService;
  52. _weekWorkService = weekWorkService;
  53. }
  54. //작업진행 필터
  55. //엑셀하고 같은 조건을 사용하기위해 분리함
  56. public IQueryable<FmsWorkResult> _Filter([FromQuery] PagingRequest req, [FromQuery] string workProgressId, [FromQuery] string facilityCode) {
  57. int nWorkProgressId = 0;
  58. int.TryParse(workProgressId, out nWorkProgressId);
  59. if (nWorkProgressId != 2 && nWorkProgressId != 4 && nWorkProgressId != 5 && nWorkProgressId != 9 && nWorkProgressId != 10 && nWorkProgressId != 11 && nWorkProgressId != 99) {
  60. throw new ServiceException("입력 파라메터가 잘못되었습니다.");
  61. }
  62. var query = _FilterAndSort(req);
  63. if (nWorkProgressId == 4) {
  64. // 작업진행 목록에서는 작업진행(4), 작업보류(7) 데이터를 조회
  65. query = query.Where(x => new int[] { 4, 7 }.Contains(x.FmsWorkRequest.WorkProgressId));
  66. }
  67. if (nWorkProgressId == 5) {
  68. // 작업완료 목록에서는 작업완료(5) 데이터를 조회
  69. query = query.Where(x => x.FmsWorkRequest.WorkProgressId == 5);
  70. }
  71. if (nWorkProgressId == 2) {
  72. // 작업 반려 목록에서는 작업반려(2) 데이터를 조회
  73. query = query.Where(x => x.FmsWorkRequest.WorkProgressId == 2);
  74. }
  75. if (nWorkProgressId == 9) {
  76. // New 작업완료(작업진행, 작업완료)
  77. query = query.Where(x => new int[] { 4, 5, 7 }.Contains(x.FmsWorkRequest.WorkProgressId));
  78. }
  79. if (nWorkProgressId == 10) {
  80. // 업무별 작업 현황 (월별 )
  81. var startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
  82. var endDate = startDate.AddMonths(1).AddDays(-1);
  83. query = query.Where(x => x.FmsWorkRequest.WorkProgressId == 4);
  84. query = query.Where(x => (x.EndDate.Date >= startDate && x.StartDate.Date <= endDate));
  85. }
  86. if (nWorkProgressId == 11) {
  87. // 업무별 작업 현황 (월별 )
  88. var startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
  89. var endDate = startDate.AddMonths(1).AddDays(-1);
  90. query = query.Where(x => x.FmsWorkRequest.WorkProgressId == 5);
  91. query = query.Where(x => (x.EndDate.Date >= startDate && x.StartDate.Date <= endDate));
  92. }
  93. if (facilityCode != null) {
  94. // var reqId = _context.FmsWorkResultToFacility.Where(x => x.FacilityCode == Util.ToInt( facilityCode)).orderby;
  95. query = query.Where(x =>
  96. x.FmsWorkResultToFacility.Where(f =>
  97. // f.SiteId == x.SiteId
  98. // && f.WorkRequestId == x.WorkRequestId
  99. f.FacilityCode == Util.ToInt(facilityCode)).Count() > 0);
  100. }
  101. return query;
  102. }
  103. /// <summary>
  104. /// 목록
  105. /// </summary>
  106. [HttpGet]
  107. public IActionResult List([FromQuery] PagingRequest req, [FromQuery] string workProgressId, [FromQuery] string facilityCode) {
  108. var query = _Filter(req, workProgressId, facilityCode);
  109. var list = _ListSelect(query);
  110. //_logger.LogInformation("query", query);
  111. var paging = PagingList.Pagination(list, req.page, req.limit);
  112. return Ok(paging);
  113. }
  114. /// <summary>
  115. /// 작업진행목록 / 작업완료목록 조회
  116. /// </summary>
  117. [HttpGet]
  118. private dynamic _ListSelect(IQueryable<FmsWorkResult> query) {
  119. var list = query.Select(x => new {
  120. x.SiteId,
  121. SiteName = x.FmsWorkRequest.Site.Name,
  122. x.WorkRequestId,
  123. BusinessFieldId = x.FmsWorkOrder.BusinessFieldId,
  124. BusinessFieldName = x.FmsWorkOrder.CmBusinessField.Name,
  125. WorkTypeId = x.FmsWorkRequest.WorkTypeId,
  126. WorkTypeName = x.FmsWorkRequest.WorkType.Name,
  127. StartDate = x.StartDate.ToString("yyyy-MM-dd"),
  128. EndDate = x.EndDate.ToString("yyyy-MM-dd"),
  129. Title = x.FmsWorkOrder.Title,
  130. WorkProgressId = x.FmsWorkRequest.WorkProgressId,
  131. WorkProgressName = x.FmsWorkRequest.WorkProgress.Name,
  132. WorkerUserId = x.WorkerUserId,
  133. WorkerUserName = x.CmUserNavigation.Name,
  134. x.Content,
  135. OrderContent = x.FmsWorkOrder.Content,
  136. RequestContent = x.FmsWorkRequest.Content,
  137. OrderDate = x.FmsWorkOrder.OrderDate.ToString("yyyy-MM-dd"),
  138. //x.AddDate != null ? x.AddDate.Value.ToString("yyyy/MM/dd") : null,
  139. StartWorkDate = x.FmsWorkOrder.StartWorkDate.ToString("yyyy-MM-dd"),
  140. OrderUserId = x.FmsWorkOrder.OrderUserId,
  141. RequestUserName = x.FmsWorkRequest.CmUserNavigation.Name,
  142. RejectUserName = x.FmsWorkRequest.CmUser.Name,
  143. //RejectReason=x.FmsWorkRequest.RejectReason,
  144. OrderUserName = x.FmsWorkOrder.CmUser.Name,
  145. x.IsConfirmed,
  146. x.ConfirmedUserId,
  147. ConfirmedUserName = x.CmUser.Name,
  148. WorkPartnerName = x.FmsWorkRequest.WorkPartner.Name,
  149. WorkPrice = x.FmsWorkRequest.WorkPrice
  150. });
  151. return list;
  152. }
  153. /// <summary>
  154. /// 작업진행 내역_엑셀파일 익스포트
  155. /// </summary>
  156. /// <param name="req"></param>
  157. /// <returns></returns>
  158. [HttpGet("WorkExcel")]
  159. public IActionResult WorkExcel([FromQuery] PagingRequest req, [FromQuery] string workProgressId, [FromQuery] string facilityCode, string filename) {
  160. req.page = 1;
  161. req.limit = 0;
  162. var query = _Filter(req, workProgressId, facilityCode);
  163. var list = _ListSelect(query);
  164. var stream = new MemoryStream();
  165. using (var package = new ExcelPackage(stream)) {
  166. var workSheet = package.Workbook.Worksheets.Add("Sheet1");
  167. workSheet.Cells.LoadFromCollection(list, true);
  168. if (req.columns != null && req.columns.Length > 0) {
  169. workSheet.AddStyle(req.columns, req.sort?.order?.ToLower() == "asc", filename);
  170. }
  171. package.Save();
  172. }
  173. stream.Position = 0;
  174. string excelName = $"excel-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
  175. return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName);
  176. }
  177. /// <summary>
  178. /// 설비별 작업 승이 내역_엑셀파일 익스포트
  179. /// </summary>
  180. /// <param name="req"></param>
  181. /// <returns></returns>
  182. [HttpGet("excel")]
  183. public IActionResult ExportExcel([FromQuery] PagingRequest req, string filename) {
  184. req.page = 1;
  185. req.limit = 0;
  186. //var query = _FilterAndSort(req);
  187. //var list = _ListSelect(query);
  188. var query = _FilterAndSort_2(req);
  189. query = query.Where(x => x.FmsWorkResult.IsConfirmed);
  190. var list = query.Select(x => new {
  191. x.SiteId,
  192. Site = x.FmsWorkResult.FmsWorkRequest.Site.Name,
  193. //x.WorkRequestId,
  194. //x.FacilityCode,
  195. //BusinessFieldName = x.FmsWorkResult.FmsWorkRequest.CmBusinessField.Name,
  196. WorkType = x.FmsWorkResult.FmsWorkRequest.WorkType.Name,
  197. StartDate = x.FmsWorkResult.StartDate.ToString("yyyy-MM-dd"),
  198. EndDate = x.FmsWorkResult.EndDate.ToString("yyyy-MM-dd"),
  199. FirstClassName = x.CmFacility.FmsFacilityCodeClass.Name,
  200. SecondClassName = x.CmFacility.FmsFacilityCodeClass1.Name,
  201. ThirdClassName = x.CmFacility.FmsFacilityCodeClass2.Name,
  202. FacilityName = x.CmFacility.Name,
  203. Title = x.FmsWorkResult.FmsWorkOrder.Title
  204. });
  205. var stream = new MemoryStream();
  206. using (var package = new ExcelPackage(stream)) {
  207. var workSheet = package.Workbook.Worksheets.Add("Sheet1");
  208. workSheet.Cells.LoadFromCollection(list, true);
  209. if (req.columns != null && req.columns.Length > 0) {
  210. workSheet.AddStyle(req.columns, req.sort?.order?.ToLower() == "asc", filename);
  211. }
  212. package.Save();
  213. }
  214. stream.Position = 0;
  215. string excelName = $"excel-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
  216. return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName);
  217. }
  218. /// <summary>
  219. /// 작업 이력 내역_엑셀파일 익스포트
  220. /// </summary>
  221. /// <param name="req"></param>
  222. /// <returns></returns>
  223. [HttpGet("WorkHistoryExcel")]
  224. public IActionResult WorkHistoryExcel([FromQuery] PagingRequest req, [FromQuery] string facilityCode, [FromQuery] int? workProgressId, string filename) {
  225. req.page = 1;
  226. req.limit = 0;
  227. var query = _FilterAndSort(req);
  228. if (facilityCode != null) {
  229. query = query.Where(x =>
  230. x.FmsWorkResultToFacility.Where(f =>
  231. f.FacilityCode == Util.ToInt(facilityCode)).Count() > 0);
  232. }
  233. if (workProgressId != null) {
  234. query = query.Where(x => x.FmsWorkRequest.WorkProgressId == workProgressId);
  235. }
  236. var list = query.Select(x => new {
  237. x.SiteId,
  238. SiteName = x.FmsWorkRequest.Site.Name,
  239. BusinessFieldName = x.FmsWorkRequest.CmBusinessField.Name,
  240. WorkTypeName = x.FmsWorkRequest.WorkType.Name,
  241. StartDate = x.StartDate.ToString("yyyy-MM-dd"),
  242. EndDate = x.EndDate.ToString("yyyy-MM-dd"),
  243. Title = x.FmsWorkOrder.Title,
  244. WorkProgressName = x.FmsWorkRequest.WorkProgress.Name,
  245. RequestUserName = x.FmsWorkRequest.CmUserNavigation.Name,
  246. WorkerUserName = x.CmUserNavigation.Name,
  247. ConfirmedUserName = x.CmUser.Name,
  248. });
  249. var stream = new MemoryStream();
  250. using (var package = new ExcelPackage(stream)) {
  251. var workSheet = package.Workbook.Worksheets.Add("Sheet1");
  252. workSheet.Cells.LoadFromCollection(list, true);
  253. if (req.columns != null && req.columns.Length > 0) {
  254. workSheet.AddStyle(req.columns, req.sort?.order?.ToLower() == "asc", filename);
  255. }
  256. package.Save();
  257. }
  258. stream.Position = 0;
  259. string excelName = $"excel-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
  260. return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName);
  261. }
  262. /// <summary>
  263. /// 작업진행달력
  264. /// </summary>
  265. [HttpGet("[action]")]
  266. public IActionResult CalendarList([FromQuery] PagingRequest req, [FromQuery] string siteId, [FromQuery] int year, [FromQuery] int month, bool businessAuth) {
  267. DateTime target = new DateTime(year, month, 1);
  268. DateTime start = target.AddMonths(-1);
  269. DateTime end = target.AddMonths(2).AddDays(-1);
  270. var query = _FilterAndSort(req);
  271. query = BusinessFieldHelper.Apply<FmsWorkResult>(_context, User, businessAuth, query, "FmsWorkOrder");
  272. query = query.Where(
  273. x => x.SiteId == Util.ToInt(siteId)
  274. && (new int[] { 4, 7 }).Contains(x.FmsWorkRequest.WorkProgressId)
  275. && x.StartDate <= end
  276. && x.EndDate >= start
  277. );
  278. var list = query.Select(x => new {
  279. x.SiteId,
  280. x.WorkRequestId,
  281. x.FmsWorkRequest.WorkProgressId,
  282. WorkProgress = new {
  283. x.FmsWorkRequest.WorkProgress.Name
  284. },
  285. x.FmsWorkRequest.WorkTypeId,
  286. WorkTypeName = x.FmsWorkRequest.WorkType.Name,
  287. x.FmsWorkOrder.BusinessFieldId,
  288. BusinessField = new {
  289. x.FmsWorkOrder.CmBusinessField.Name
  290. },
  291. x.FmsWorkOrder.Title,
  292. x.Content,
  293. OrderContent = x.FmsWorkOrder.Content,
  294. RequestContent = x.FmsWorkRequest.Content,
  295. x.StartDate,
  296. x.EndDate,
  297. x.FmsWorkOrder.OrderDate,
  298. x.FmsWorkOrder.StartWorkDate,
  299. x.FmsWorkOrder.OrderUserId,
  300. OrderUser = new {
  301. x.FmsWorkOrder.CmUser.Name
  302. },
  303. x.WorkerUserId,
  304. WorkerUser = new {
  305. x.CmUserNavigation.Name
  306. },
  307. x.IsConfirmed,
  308. x.ConfirmedUserId,
  309. ConfirmedUser = new {
  310. x.CmUser.Name
  311. },
  312. });
  313. return Ok(list);
  314. }
  315. /// <summary>
  316. /// 항목조회
  317. /// </summary>
  318. [HttpGet("[action]")]
  319. public IActionResult Get([FromQuery] string siteId, [FromQuery] string workRequestId) {
  320. var query = _service.GetAll()
  321. .Where(x => x.SiteId == Util.ToInt(siteId) && x.WorkRequestId == Util.ToInt(workRequestId));
  322. var item = query.Select(x => new {
  323. x.SiteId,
  324. CmSite = new {
  325. x.FmsWorkRequest.Site.Name
  326. },
  327. x.WorkRequestId,
  328. x.FmsWorkRequest.WorkScheduleId,
  329. x.FmsWorkRequest.WorkProgressId,
  330. WorkProgress = new {
  331. x.FmsWorkRequest.WorkProgress.Name,
  332. x.FmsWorkRequest.WorkProgress.WorkProgressId,
  333. },
  334. x.FmsWorkRequest.WorkTypeId,
  335. WorkType = new {
  336. x.FmsWorkRequest.WorkType.Name
  337. },
  338. x.FmsWorkOrder.BusinessFieldId,
  339. BusinessField = new {
  340. x.FmsWorkOrder.CmBusinessField.Name
  341. },
  342. x.FmsWorkOrder.Title,
  343. x.Content,
  344. FmsWorkOrder = new {
  345. x.FmsWorkOrder.Content,
  346. },
  347. FmsWorkRequest = new {
  348. x.FmsWorkRequest.Content,
  349. x.FmsWorkRequest.WorkUsers,
  350. x.FmsWorkRequest.StartWorkDate,
  351. },
  352. x.StartDate,
  353. x.EndDate,
  354. x.FmsWorkOrder.OrderDate,
  355. x.FmsWorkOrder.StartWorkDate,
  356. WorkDueDate = (x.FmsWorkRequest.FmsWorkSchedule == null ? x.FmsWorkRequest.StartWorkDate : x.FmsWorkRequest.FmsWorkSchedule.WorkDueDate),
  357. x.FmsWorkOrder.OrderUserId,
  358. OrderUser = new {
  359. x.FmsWorkOrder.CmUser.Name
  360. },
  361. x.WorkerUserId,
  362. WorkerUser = new {
  363. x.CmUserNavigation.Name
  364. },
  365. x.IsConfirmed,
  366. x.ConfirmedUserId,
  367. ConfirmedUser = new {
  368. x.CmUser.Name
  369. },
  370. x.ConfirmDesc,
  371. RejectReason = x.FmsWorkRequest.RejectReason,
  372. WorkPartner = new {
  373. x.FmsWorkRequest.WorkPartner.Name,
  374. x.FmsWorkRequest.WorkPartner.PartnerId
  375. },
  376. WorkPrice = x.FmsWorkRequest.WorkPrice,
  377. WorkItem = x.FmsWorkRequest.WorkItem,
  378. WorkEndDate = x.FmsWorkRequest.WorkEndDate,
  379. WorkDetailType = new {
  380. x.FmsWorkRequest.WorkDetailType.Code,
  381. x.FmsWorkRequest.WorkDetailType.Name,
  382. },
  383. CmFile = _storage.ParseFile(x.FmsWorkRequest.CmFile),
  384. FmsWorkResultToFacility = x.FmsWorkResultToFacility.Select(f => new {
  385. f.SiteId,
  386. f.WorkRequestId,
  387. f.FacilityCode,
  388. CmFacility = new {
  389. f.CmFacility.Name,
  390. f.CmFacility.BuildingId,
  391. CmBuilding = new {
  392. f.CmFacility.CmBuilding.Name,
  393. },
  394. f.CmFacility.FloorId,
  395. CmFloor = new {
  396. f.CmFacility.CmFloor.Name,
  397. },
  398. f.CmFacility.FirstClassId,
  399. FirstClass = new {
  400. f.CmFacility.FmsFacilityCodeClass.Name,
  401. },
  402. f.CmFacility.SecondClassId,
  403. SecondClass = new {
  404. f.CmFacility.FmsFacilityCodeClass1.Name,
  405. },
  406. f.CmFacility.ThirdClassId,
  407. ThirdClass = new {
  408. f.CmFacility.FmsFacilityCodeClass2.Name,
  409. },
  410. },
  411. }).ToList(),
  412. FmsWorkRequestToAccident = x.FmsWorkRequest.FmsWorkRequestToAccident.Select(f => new {
  413. f.SiteId,
  414. f.WorkRequestId,
  415. f.AccidentId,
  416. FmsAccident = new {
  417. f.FmsAccident.SiteId,
  418. f.FmsAccident.AccidentId,
  419. f.FmsAccident.Name,
  420. f.FmsAccident.AccidentTypeId,
  421. AccidentTypeName = f.FmsAccident.FmsAccidentCodeType.Name,
  422. Dates = new {
  423. StartDate = f.FmsAccident.StartDate == null ? null : ((DateTime)f.FmsAccident.StartDate).ToString("yyyy.MM.dd"),
  424. EndDate = f.FmsAccident.EndDate == null ? null : ((DateTime)f.FmsAccident.EndDate).ToString("yyyy.MM.dd"),
  425. },
  426. f.FmsAccident.DepartmentId,
  427. DepartmentName = f.FmsAccident.CmDepartment.Name,
  428. f.FmsAccident.AccidentLocation,
  429. },
  430. }).ToList(),
  431. FmsWorkRequestToComplaint = x.FmsWorkRequest.FmsWorkRequestToComplaint.Select(f => new {
  432. f.SiteId,
  433. f.WorkRequestId,
  434. f.ComplaintId,
  435. FmsComplaints = new {
  436. f.FmsComplaints.SiteId,
  437. f.FmsComplaints.ComplaintId,
  438. f.FmsComplaints.Name,
  439. f.FmsComplaints.ComplaintTypeId,
  440. ComplaintTypeName = f.FmsComplaints.FmsComplaintCodeType.Name,
  441. Dates = new {
  442. StartDate = f.FmsComplaints.StartDate == null ? null : ((DateTime)f.FmsComplaints.StartDate).ToString("yyyy.MM.dd"),
  443. EndDate = f.FmsComplaints.EndDate == null ? null : ((DateTime)f.FmsComplaints.EndDate).ToString("yyyy.MM.dd"),
  444. },
  445. f.FmsComplaints.DepartmentId,
  446. DepartmentName = f.FmsComplaints.CmDepartment.Name,
  447. f.FmsComplaints.ComplaintLocation,
  448. },
  449. }).ToList(),
  450. }).FirstOrDefault();
  451. return Ok(item);
  452. }
  453. /// <summary>
  454. /// 작업내 사용 자재목록 조회
  455. /// </summary>
  456. [HttpGet("[action]")]
  457. public IActionResult Materials([FromQuery] PagingRequest req, [FromQuery] string siteId, [FromQuery] string workRequestId) {
  458. var query = _context.FmsWorkResultCheckItemMaterial as IQueryable<FmsWorkResultCheckItemMaterial>;
  459. query = query.Filter(req.conditions);
  460. query = query.Sort(req.sort);
  461. query = query.Where(
  462. x => x.SiteId == Util.ToInt(siteId)
  463. && x.WorkRequestId == Util.ToInt(workRequestId)
  464. );
  465. var list = query.Select(x => new {
  466. x.FmsMaterial.Name,
  467. x.FmsMaterial.Standard,
  468. x.MaterialCount,
  469. });
  470. return Ok(list);
  471. }
  472. /// <summary>
  473. /// 작업이력 조회
  474. /// </summary>
  475. [HttpGet("[action]")]
  476. public IActionResult CheckItems([FromQuery] PagingRequest req, [FromQuery] string siteId, [FromQuery] string workRequestId) {
  477. var query = _context.FmsWorkResultCheckItem as IQueryable<FmsWorkResultCheckItem>;
  478. query = query.Filter(req.conditions);
  479. query = query.Sort(req.sort);
  480. query = query.Where(
  481. x => x.SiteId == Util.ToInt(siteId)
  482. && x.WorkRequestId == Util.ToInt(workRequestId)
  483. );
  484. var list = query.Select(x => new {
  485. x.SiteId,
  486. x.WorkRequestId,
  487. x.CheckItemId,
  488. x.CheckDate,
  489. x.TextResult,
  490. x.BoolResult,
  491. Title = x.CheckDate.ToString("yyyy-MM-dd") + "-" + x.TextResult,
  492. CmFile1 = _storage.ParseFile(x.CmFile1),
  493. CmFile2 = _storage.ParseFile(x.CmFile2),
  494. });
  495. return Ok(list);
  496. }
  497. /// <summary>
  498. /// 작업이력 항목 조회 (이력 내 사용 자재목록 포함하여 조회)
  499. /// </summary>
  500. [HttpGet("[action]")]
  501. public IActionResult GetCheckItem([FromQuery] string siteId, [FromQuery] string workRequestId, [FromQuery] string checkItemId) {
  502. var query = _context.FmsWorkResultCheckItem.AsExpandable() as IQueryable<FmsWorkResultCheckItem>;
  503. query = query.Where(
  504. x => x.SiteId == Util.ToInt(siteId)
  505. && x.WorkRequestId == Util.ToInt(workRequestId)
  506. && x.CheckItemId == Util.ToInt(checkItemId)
  507. );
  508. var item = query.Select(x => new {
  509. x.SiteId,
  510. x.WorkRequestId,
  511. x.CheckItemId,
  512. x.CheckDate,
  513. x.TextResult,
  514. x.BoolResult,
  515. CmFile1 = _storage.ParseFile(x.CmFile1),
  516. CmFile2 = _storage.ParseFile(x.CmFile2),
  517. WorkProgressId = x.FmsWorkResult.FmsWorkRequest.WorkProgressId,
  518. FmsWorkResultCheckItemMaterial = x.FmsWorkResultCheckItemMaterial.Select(f => new {
  519. f.CheckItemId,
  520. f.CheckItemMaterialId,
  521. f.MaterialId,
  522. f.MaterialCode,
  523. f.MaterialCount,
  524. f.Name,
  525. FmsMaterial = new {
  526. f.FmsMaterial.MaterialId,
  527. f.FmsMaterial.MaterialCode,
  528. f.FmsMaterial.Name,
  529. f.FmsMaterial.Standard,
  530. f.FmsMaterial.Unit,
  531. },
  532. StockCount = FmsMaterial.GetStockCount.Invoke(f.FmsMaterial),
  533. StockAmount = FmsMaterial.GetStockAmount.Invoke(f.FmsMaterial),
  534. }).ToList()
  535. }).FirstOrDefault();
  536. return Ok(item);
  537. }
  538. /// <summary>
  539. /// 작업진행목록 / 작업완료목록 조회
  540. /// </summary>
  541. [HttpGet("[action]")]
  542. public IActionResult FacilityList([FromQuery] PagingRequest req) {
  543. var query = _FilterAndSort_2(req);
  544. query = query.Where(x => x.FmsWorkResult.IsConfirmed);
  545. var list = query.Select(x => new {
  546. x.SiteId,
  547. Site = x.FmsWorkResult.FmsWorkRequest.Site.Name,
  548. x.WorkRequestId,
  549. x.FacilityCode,
  550. FirstClassName = x.CmFacility.FmsFacilityCodeClass.Name,
  551. SecondClassName = x.CmFacility.FmsFacilityCodeClass1.Name,
  552. ThirdClassName = x.CmFacility.FmsFacilityCodeClass2.Name,
  553. FacilityName = x.CmFacility.Name,
  554. WorkType = x.FmsWorkResult.FmsWorkRequest.WorkType.Name,
  555. StartDate = x.FmsWorkResult.StartDate.ToString("yyyy-MM-dd"),
  556. EndDate = x.FmsWorkResult.EndDate.ToString("yyyy-MM-dd"),
  557. Title = x.FmsWorkResult.FmsWorkOrder.Title
  558. });
  559. var paging = PagingList.Pagination(list, req.page, req.limit);
  560. return Ok(paging);
  561. }
  562. /// <summary>
  563. /// 작업진행 저장 (작업대기 미사용시 종료일 수정)
  564. /// </summary>
  565. [HttpPost("[action]")]
  566. public IActionResult Save([FromBody] FmsWorkResult data) {
  567. _logger.LogInformation("Save");
  568. //_logger.LogInformation(data.Dump());
  569. ModelState.RemoveStartOf("FmsWorkRequest");
  570. ModelState.RemoveStartOf("FmsWorkOrder");
  571. if (ModelState.IsValid) {
  572. _service.Save(data);
  573. } else {
  574. return BadRequest(ModelState);
  575. }
  576. return Ok();
  577. }
  578. /// <summary>
  579. /// 작업이력 저장 (완료처리 및 보류처리 포함)
  580. /// </summary>
  581. [HttpPost("[action]")]
  582. public IActionResult SaveCheckItem([FromBody] FmsWorkResultCheckItem data) {
  583. _logger.LogInformation("Save");
  584. //_logger.LogInformation(data.Dump());
  585. ModelState.RemoveStartOf("CmFile1");
  586. ModelState.RemoveStartOf("CmFile2");
  587. ModelState.RemoveStartOf("FmsWorkResultCheckItemMaterial");
  588. if (ModelState.IsValid) {
  589. _service.SaveCheckItem(data, User.Identity.Name);
  590. } else {
  591. return BadRequest(ModelState);
  592. }
  593. return Ok();
  594. }
  595. /// <summary>
  596. /// 작업진행(보류해제)
  597. /// </summary>
  598. [HttpPost("[action]")]
  599. public IActionResult Continue([FromBody] FmsWorkResult data) {
  600. _service.Continue(data);
  601. return Ok();
  602. }
  603. /// <summary>
  604. /// 작업보류
  605. /// </summary>
  606. [HttpPost("[action]")]
  607. public IActionResult Hold([FromBody] FmsWorkResult data) {
  608. _service.Hold(data.FmsWorkRequest);
  609. return Ok();
  610. }
  611. /// <summary>
  612. /// 작업완료
  613. /// </summary>
  614. [HttpPost("[action]")]
  615. public IActionResult Complete([FromBody] FmsWorkResult data) {
  616. _service.CompleteWithAdditionalData(data);
  617. return Ok();
  618. }
  619. /// <summary>
  620. /// 승인
  621. /// </summary>
  622. [HttpPost("[action]")]
  623. public IActionResult Confirm([FromBody] FmsWorkResult data, [FromQuery] DateTime? date) {
  624. _service.Confirm(data, date);
  625. return Ok();
  626. }
  627. /// <summary>
  628. /// 차기작업 확정일자 및 현작업 종료일자 조회
  629. /// { WorkDueDate, EndDate }
  630. /// </summary>
  631. [HttpGet("[action]")]
  632. public IActionResult GetAvailDueDate([FromQuery] string siteId, [FromQuery] string workRequestId) {
  633. return Ok(_service.GetAvailDueDate(Util.ToInt(siteId), Util.ToInt(workRequestId)));
  634. }
  635. [HttpDelete("{siteId}/{workRequestId}")]
  636. public IActionResult Delete(int siteId, int workRequestId) {
  637. _service.Delete(siteId, workRequestId);
  638. // _scheduleService.DeleteWithResult(siteId, workRequestId);
  639. return Ok();
  640. }
  641. // 검색 & 정렬 공통
  642. private IQueryable<FmsWorkResult> _FilterAndSort(PagingRequest req) {
  643. var query = _service.GetAll();
  644. // 기본 Entity 검색
  645. query = query.Filter(req.conditions);
  646. if (req.siteId != null)
  647. query = query.Where(x => x.SiteId == req.siteId);
  648. if (req.siteIds != null && req.siteIds.Length > 0) {
  649. query = query.Where(x => req.siteIds.Contains(x.SiteId));
  650. }
  651. if (req.businessFieldId != null) {
  652. query = query.Where(x => x.SiteId == req.siteId);
  653. query = query.Where(x => x.FmsWorkRequest.BusinessFieldId == req.businessFieldId || x.FmsWorkRequest.CmBusinessField.Name == "공통");
  654. }
  655. if (req.conditions != null) {
  656. foreach (var item in req.conditions) {
  657. if (item.field == "FacilityTypeId") {
  658. query = query.Where(x => x.FmsWorkResultToFacility.Any(f => f.CmFacility.FacilityTypeId == Util.ToInt(item.value)));
  659. }
  660. }
  661. }
  662. // 기본 Entity 정렬
  663. //query = query.Sort(req.sort);
  664. if (req.sort != null) {
  665. if (req.sort.field == "Custom") {
  666. query = query.OrderByDescending(x => x.StartDate).ThenBy(x => x.FmsWorkRequest.Title).ThenBy(x => x.FmsWorkRequest.Site.SortOrderNo);
  667. } else if (req.sort.field == "Def") {
  668. query = query.OrderBy(x => x.FmsWorkRequest.Site.SortOrderNo);
  669. } else {
  670. query = query.Sort(req.sort);
  671. }
  672. }
  673. return query;
  674. }
  675. private IQueryable<FmsWorkResultToFacility> _FilterAndSort_2(PagingRequest req) {
  676. var query = _service_2.GetAll();
  677. // 기본 Entity 검색
  678. query = query.Filter(req.conditions);
  679. if (req.siteId != null) {
  680. query = query.Where(x => x.SiteId == Util.ToInt(req.siteId));
  681. }
  682. if (req.businessFieldId != null) {
  683. query = query.Where(x => x.SiteId == req.siteId);
  684. query = query.Where(x => x.FmsWorkResult.FmsWorkRequest.BusinessFieldId == req.businessFieldId || x.FmsWorkResult.FmsWorkRequest.CmBusinessField.Name == "공통");
  685. }
  686. // 기본 Entity 정렬
  687. query = query.Sort(req.sort);
  688. return query;
  689. }
  690. //작업승인 달력 상세(리스트)
  691. [HttpGet("[action]")]
  692. public IActionResult CustomList([FromQuery] PagingRequest req, DateTime dates) {
  693. DateTime selectMonth;
  694. selectMonth = new DateTime(dates.Year, dates.Month, dates.Day);
  695. var startDate = selectMonth;
  696. var endDate = selectMonth.AddDays(1).AddSeconds(-1);
  697. var list = _service.GetAll()
  698. .Where(x => x.FmsWorkRequest.StartWorkDate >= startDate && x.FmsWorkRequest.StartWorkDate <= endDate && x.FmsWorkRequest.WorkProgressId == 6)
  699. .Select(x => new { Title = "[" + x.FmsWorkRequest.Site.Name + "]" + x.FmsWorkRequest.Title, x.SiteId, x.WorkRequestId, WorkTypeId = x.FmsWorkRequest.WorkTypeId });
  700. var paging = PagingList.Pagination(list, req.page, req.limit);
  701. return Ok(paging);
  702. }
  703. //작업승인 달력 상세(리스트)
  704. [HttpGet("[action]")]
  705. public IActionResult CustomListSite([FromQuery] PagingRequest req, int siteId, DateTime dates) {
  706. DateTime selectMonth;
  707. selectMonth = new DateTime(dates.Year, dates.Month, dates.Day);
  708. var startDate = selectMonth;
  709. var endDate = selectMonth.AddDays(1).AddSeconds(-1);
  710. var list = _service.GetAll()
  711. .Where(x => x.SiteId == siteId && x.FmsWorkRequest.StartWorkDate >= startDate && x.FmsWorkRequest.StartWorkDate <= endDate && x.FmsWorkRequest.WorkProgressId == 6)
  712. .Select(x => new { x.FmsWorkRequest.Title, x.SiteId, x.WorkRequestId, WorkTypeId = x.FmsWorkRequest.WorkTypeId });
  713. var paging = PagingList.Pagination(list, req.page, req.limit);
  714. return Ok(paging);
  715. }
  716. //본사용 작업승인 달력
  717. [HttpGet("[action]")]
  718. public IActionResult WorkStateCalendar(int? year, int? month) {
  719. //var siteId = User.GetSiteId();
  720. DateTime selectMonth;
  721. if (year == null || month == null) {
  722. selectMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
  723. } else {
  724. selectMonth = new DateTime(year.Value, month.Value, 1);
  725. }
  726. var startDate = selectMonth.AddDays(-7);
  727. var endDate = selectMonth.AddDays(37);
  728. //주별중점업무
  729. var WeekQuery = _weekWorkService.GetWeek(100, startDate, endDate);
  730. var weekList = WeekQuery.Select(x => new {
  731. Title = x.WorkName,
  732. Start = x.WorkDate.ToString("yyyy-MM-dd"),
  733. End = x.WorkDate.AddDays(7).ToString("yyyy-MM-dd"),
  734. Id = x.WeekKeyWorkId,
  735. GroupId = 0,
  736. Type = "주별",
  737. }).ToList();
  738. // // 계획
  739. // var requestQuery = _requestService.GetAll()
  740. // .Where(x => x.StartWorkDate.Date >= startDate.Date && x.StartWorkDate.Date <= endDate.Date)
  741. // .AsEnumerable()
  742. // .Select(x => new { WorkDate = x.StartWorkDate.ToString("yyyy-MM-dd") }).ToList();
  743. // var requestGroupQuery = from x in requestQuery
  744. // group x by x.WorkDate into g
  745. // select new {
  746. // WorkDate = g.Key,
  747. // Count = g.Count(),
  748. // };
  749. // var requestList = requestGroupQuery.Select(x => new {
  750. // Title = "계획 : " + x.Count.ToString("#,###") + " 건",
  751. // Start = x.WorkDate,
  752. // End = x.WorkDate,
  753. // Id = x.WorkDate + "|1",
  754. // GroupId = 1,
  755. // Type = "예정",
  756. // });
  757. // // 승인
  758. // var resultQuery = _service.GetAll()
  759. // .Where(x => x.FmsWorkRequest.StartWorkDate.Date >= startDate.Date && x.FmsWorkRequest.StartWorkDate.Date <= endDate.Date && x.FmsWorkRequest.WorkProgressId == 6)
  760. // .AsEnumerable()
  761. // .Select(x => new { StartWorkDate = x.ConfirmedDate != null ? Convert.ToDateTime(x.FmsWorkRequest.StartWorkDate.Date).ToString("yyyy-MM-dd") : "" }).ToList();
  762. // var resultGroupQuery = from x in resultQuery
  763. // group x by x.StartWorkDate into g
  764. // select new {
  765. // StartWorkDate = g.Key,
  766. // Count = g.Count(),
  767. // };
  768. // // 승인을 완료로 문구만 변경 (2020.07.29)
  769. // var resultList = resultGroupQuery.Select(x => new CalendarEvent {
  770. // Title = "완료 : " + x.Count.ToString("#,###") + " 건",
  771. // Start = x.StartWorkDate,
  772. // End = x.StartWorkDate,
  773. // Id = x.StartWorkDate + "|6",
  774. // GroupId = 2,
  775. // Type = "승인",
  776. // });
  777. // 계획/승인 - 통합 (2020.07.29)
  778. var reqsList = _service.GetRequestResult(null, startDate, endDate);
  779. var siteId = 100;
  780. // 휴일
  781. var holidayList = _GetHolidayList(siteId, selectMonth.Year, selectMonth.Month, startDate, endDate);
  782. // 주말
  783. var weekend = _context.CmHolidayWeekend.Where(
  784. x => x.SiteId == siteId
  785. && x.IsUse == true
  786. ).FirstOrDefault();
  787. // 집중업무
  788. var workName = _monthWorkService.GetKeyWork(siteId, selectMonth.Month);
  789. if (weekend != null) {
  790. }
  791. var result = new {
  792. Year = selectMonth.Year,
  793. Month = selectMonth.Month,
  794. Theme = workName,
  795. StartDate = startDate.ToString("yyyy-MM-dd"),
  796. EndDate = endDate.ToString("yyyy-MM-dd"),
  797. // RequestList = requestList,
  798. // ResultList = resultList,
  799. HolidayList = holidayList,
  800. WeekList = weekList,
  801. Saturday = weekend?.Saturday ?? false,
  802. Sunday = weekend?.Sunday ?? false,
  803. RequestResultList = reqsList,
  804. };
  805. return Ok(result);
  806. }
  807. //현장용 작업승인 달력
  808. [HttpGet("[action]")]
  809. public IActionResult WorkStateCalendarSite(int siteId, int? year, int? month) {
  810. //var siteId = User.GetSiteId();
  811. DateTime selectMonth;
  812. if (year == null || month == null) {
  813. selectMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
  814. } else {
  815. selectMonth = new DateTime(year.Value, month.Value, 1);
  816. }
  817. var startDate = selectMonth.AddDays(-7);
  818. var endDate = selectMonth.AddDays(37);
  819. //주별중점업무
  820. var WeekQuery = _weekWorkService.GetWeek(siteId, startDate, endDate);
  821. var weekList = WeekQuery.Select(x => new {
  822. Title = x.WorkName,
  823. Start = x.WorkDate.ToString("yyyy-MM-dd"),
  824. End = x.WorkDate.AddDays(1).ToString("yyyy-MM-dd"),
  825. Id = x.WeekKeyWorkId,
  826. GroupId = 0,
  827. Type = "주별",
  828. }).ToList();
  829. // // 계획
  830. // var requestQuery = _requestService.GetAll()
  831. // .Where(x => x.SiteId == siteId && x.StartWorkDate.Date >= startDate.Date && x.StartWorkDate.Date <= endDate.Date)
  832. // .AsEnumerable()
  833. // .Select(x => new { WorkDate = x.StartWorkDate.ToString("yyyy-MM-dd") }).ToList();
  834. // var requestGroupQuery = from x in requestQuery
  835. // group x by x.WorkDate into g
  836. // select new {
  837. // WorkDate = g.Key,
  838. // Count = g.Count(),
  839. // };
  840. // var requestList = requestGroupQuery.Select(x => new {
  841. // Title = "계획 : " + x.Count.ToString("#,###") + " 건",
  842. // Start = x.WorkDate,
  843. // End = x.WorkDate,
  844. // Id = x.WorkDate + "|1",
  845. // GroupId = 1,
  846. // Type = "예정",
  847. // });
  848. // // 승인
  849. // var resultQuery = _service.GetAll()
  850. // .Where(x => x.SiteId == siteId && x.FmsWorkRequest.StartWorkDate.Date >= startDate.Date && x.FmsWorkRequest.StartWorkDate.Date <= endDate.Date && x.FmsWorkRequest.WorkProgressId == 6)
  851. // .AsEnumerable()
  852. // .Select(x => new { StartWorkDate = x.ConfirmedDate != null ? Convert.ToDateTime(x.FmsWorkRequest.StartWorkDate.Date).ToString("yyyy-MM-dd") : "" }).ToList();
  853. // var resultGroupQuery = from x in resultQuery
  854. // group x by x.StartWorkDate into g
  855. // select new {
  856. // StartWorkDate = g.Key,
  857. // Count = g.Count(),
  858. // };
  859. // // 승인을 완료로 문구만 변경 (2020.07.29)
  860. // var resultList = resultGroupQuery.Select(x => new CalendarEvent {
  861. // Title = "완료 : " + x.Count.ToString("#,###") + " 건",
  862. // Start = x.StartWorkDate,
  863. // End = x.StartWorkDate,
  864. // Id = x.StartWorkDate + "|6",
  865. // GroupId = 2,
  866. // Type = "승인",
  867. // });
  868. // 계획/승인 - 통합 (2020.07.29)
  869. var reqsList = _service.GetRequestResult(siteId, startDate, endDate);
  870. // 휴일
  871. var holidayList = _GetHolidayList(siteId, selectMonth.Year, selectMonth.Month, startDate, endDate);
  872. // 주말
  873. var weekend = _context.CmHolidayWeekend.Where(
  874. x => x.SiteId == siteId
  875. && x.IsUse == true
  876. ).FirstOrDefault();
  877. // 집중업무
  878. var workName = _monthWorkService.GetKeyWork(siteId, selectMonth.Month);
  879. if (weekend != null) {
  880. }
  881. var result = new {
  882. Year = selectMonth.Year,
  883. Month = selectMonth.Month,
  884. Theme = workName,
  885. StartDate = startDate.ToString("yyyy-MM-dd"),
  886. EndDate = endDate.ToString("yyyy-MM-dd"),
  887. // RequestList = requestList,
  888. // ResultList = resultList,
  889. HolidayList = holidayList,
  890. WeekList = weekList,
  891. Saturday = weekend?.Saturday ?? false,
  892. Sunday = weekend?.Sunday ?? false,
  893. RequestResultList = reqsList,
  894. };
  895. return Ok(result);
  896. }
  897. //본사용 작업계획 (달력)
  898. private IQueryable<CalendarEvent> _GetRequestEventList(DateTime startDate, DateTime endDate) {
  899. // var query = from x in _context.FmsWorkRequest
  900. // where x.FmsWorkResult == null
  901. // where x.StartWorkDate.Date >= startDate.Date && x.StartWorkDate.Date <= endDate.Date
  902. // && x.WorkProgressId == 1 // 작업계획
  903. // && (x.FmsWorkSchedule == null || (x.FmsWorkSchedule != null && x.FmsWorkSchedule.IsUse == true))
  904. // select new { x.StartWorkDate };
  905. // var query = from x in _context.FmsWorkSchedule
  906. // where x.WorkDueDate.Date >= startDate.Date && x.WorkDueDate.Date <= endDate.Date
  907. // select new {
  908. // x.WorkDueDate
  909. // };
  910. var query = _requestService.GetAll()
  911. .Where(x => x.FmsWorkResult == null)
  912. .Where(x => x.StartWorkDate.Date >= startDate.Date && x.StartWorkDate.Date <= endDate.Date && x.WorkProgressId == 1)
  913. .Where(x => (x.FmsWorkSchedule == null || (x.FmsWorkSchedule != null && x.FmsWorkSchedule.IsUse == true)))
  914. //query.Where(x=>x.FmsWorkResult == null );
  915. //.AsEnumerable()
  916. .Select(x => new { WorkDate = x.StartWorkDate.ToString("yyyy-MM-dd") });
  917. var groupQuery = from x in query
  918. group x by x.WorkDate into g
  919. select new {
  920. WorkDate = g.Key,
  921. Count = g.Count(),
  922. };
  923. var list = groupQuery.Select(x => new CalendarEvent {
  924. Title = "계획 : " + x.Count.ToString(),
  925. Start = x.WorkDate,
  926. End = x.WorkDate,
  927. Id = x.WorkDate + "|1",
  928. GroupId = 1,
  929. Type = "예정",
  930. });
  931. return list;
  932. }
  933. //본사용 작업승인 (달력)
  934. private IQueryable<CalendarEvent> _GetResultEventList(DateTime startDate, DateTime endDate) {
  935. // var query = from x in _context.FmsWorkResult
  936. // where x.ConfirmedDate >= startDate.Date && x.ConfirmedDate <= endDate.Date
  937. // where x.FmsWorkRequest.WorkProgressId == 6
  938. // select new { x.ConfirmedDate };
  939. var query = _service.GetAll()
  940. .Where(x => x.ConfirmedDate >= startDate.Date && x.ConfirmedDate <= endDate.Date && x.FmsWorkRequest.WorkProgressId == 6)
  941. .Select(x => new { ConfirmedDate = x.ConfirmedDate != null ? Convert.ToDateTime(x.ConfirmedDate).ToString("yyyy-MM-dd") : "" });
  942. var groupQuery = from x in query
  943. group x by x.ConfirmedDate into g
  944. select new {
  945. ConfirmedDate = g.Key,
  946. Count = g.Count(),
  947. };
  948. var list = groupQuery.Select(x => new CalendarEvent {
  949. Title = "승인 : " + x.Count.ToString(),
  950. Start = x.ConfirmedDate,
  951. End = x.ConfirmedDate,
  952. //WorkType = x.FmsWorkRequest.WorkType.Name,
  953. Id = x.ConfirmedDate + "|6",
  954. GroupId = 2,
  955. Type = "승인",
  956. //WorkRequestId = x.WorkRequestId,
  957. });
  958. return list;
  959. }
  960. //현장용 작업승인 달력
  961. [HttpGet("[action]")]
  962. public IActionResult WorkCalendar(int siteId, string workProgressId, int? year, int? month) {
  963. //var siteId = User.GetSiteId();
  964. DateTime selectMonth;
  965. if (year == null || month == null) {
  966. selectMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
  967. } else {
  968. selectMonth = new DateTime(year.Value, month.Value, 1);
  969. }
  970. var startDate = selectMonth.AddDays(-7);
  971. var endDate = selectMonth.AddDays(37);
  972. // // 작업예정
  973. // var requestList = _GetRequestEventList(siteId, startDate, endDate);
  974. // 작업진행 및 승인
  975. var resultList = _GetResultEventList(siteId, workProgressId, startDate, endDate);
  976. if (siteId == 0) siteId = 100;
  977. // 휴일
  978. var holidayList = _GetHolidayList(siteId, selectMonth.Year, selectMonth.Month, startDate, endDate);
  979. // 주말
  980. var weekend = _context.CmHolidayWeekend.Where(
  981. x => x.SiteId == siteId
  982. && x.IsUse == true
  983. ).FirstOrDefault();
  984. // 집중업무
  985. var workName = _monthWorkService.GetKeyWork(siteId, selectMonth.Month);
  986. //주별중점업무
  987. var WeekQuery = _weekWorkService.GetWeek(siteId, startDate, endDate);
  988. var weekList = WeekQuery.Select(x => new {
  989. Title = x.WorkName,
  990. Start = x.WorkDate.ToString("yyyy-MM-dd"),
  991. End = x.WorkDate.AddDays(7).ToString("yyyy-MM-dd"),
  992. Id = x.WeekKeyWorkId,
  993. //SiteId = x.SiteId,
  994. GroupId = 0,
  995. //Date = x.WorkDate.ToString("yyyy-MM-dd"),
  996. Type = "주별",
  997. }).ToList();
  998. if (weekend != null) {
  999. }
  1000. var result = new {
  1001. Year = selectMonth.Year,
  1002. Month = selectMonth.Month,
  1003. Theme = workName,
  1004. StartDate = startDate.ToString("yyyy-MM-dd"),
  1005. EndDate = endDate.ToString("yyyy-MM-dd"),
  1006. //RequestList = requestList,
  1007. ResultList = resultList,
  1008. HolidayList = holidayList,
  1009. Saturday = weekend?.Saturday ?? false,
  1010. Sunday = weekend?.Sunday ?? false,
  1011. WeekList = weekList,
  1012. };
  1013. return Ok(result);
  1014. }
  1015. //현장용 작업계획 (달력)
  1016. private IQueryable<CalendarEvent> _GetRequestEventList(int? siteId, DateTime startDate, DateTime endDate) {
  1017. var events = _context.FmsWorkRequest.Select(x => x);
  1018. if (siteId != null) {
  1019. events = events.Where(x => x.SiteId == siteId.Value);
  1020. }
  1021. var query = from x in events
  1022. where x.FmsWorkResult == null
  1023. where x.StartWorkDate.Date >= startDate.Date && x.StartWorkDate.Date <= endDate.Date
  1024. && x.WorkProgressId == 1 // 작업계획
  1025. && (x.FmsWorkSchedule == null || (x.FmsWorkSchedule != null && x.FmsWorkSchedule.IsUse == true))
  1026. select x;
  1027. var list = query.Select(x => new CalendarEvent {
  1028. Title = x.Title,
  1029. Start = x.StartWorkDate.ToString("yyyy-MM-dd"),
  1030. End = x.StartWorkDate.ToString("yyyy-MM-dd"),
  1031. WorkType = x.WorkType.Name,
  1032. Id = x.SiteId.ToString() + "-" + x.WorkRequestId.ToString(),
  1033. GroupId = x.WorkTypeId,
  1034. Type = "예정",
  1035. WorkRequestId = x.WorkRequestId,
  1036. });
  1037. return list;
  1038. }
  1039. //현장용 작업단계별 (달력)
  1040. private IQueryable<CalendarEvent> _GetResultEventList(int? siteId, string workProgressId, DateTime startDate, DateTime endDate) {
  1041. int nWorkProgressId = 0;
  1042. int.TryParse(workProgressId, out nWorkProgressId);
  1043. var events = _context.FmsWorkResult.Select(x => x);
  1044. if (siteId != null && siteId != 0) {
  1045. events = events.Where(x => x.SiteId == siteId.Value);
  1046. }
  1047. if (nWorkProgressId == 4) {
  1048. // 작업진행 목록에서는 작업진행(4), 작업보류(7) 데이터를 조회
  1049. events = events.Where(x => (x.FmsWorkRequest.WorkProgressId == 4 || x.FmsWorkRequest.WorkProgressId == 7));
  1050. }
  1051. if (nWorkProgressId == 6) {
  1052. // 작업완료 목록에서는 작업완료(5) 데이터를 조회
  1053. events = events.Where(x => x.FmsWorkRequest.WorkProgressId == 6);
  1054. }
  1055. var query = from x in events
  1056. where x.StartDate.Date >= startDate.Date && x.StartDate <= endDate.Date
  1057. select x;
  1058. var list = query.Select(x => new CalendarEvent {
  1059. Title = siteId == 0 ? "[" + x.FmsWorkRequest.Site.Name + "]" + x.FmsWorkRequest.Title : x.FmsWorkRequest.Title,
  1060. Start = x.StartDate.ToString("yyyy-MM-dd"),
  1061. End = x.EndDate.ToString("yyyy-MM-dd"),
  1062. WorkType = x.FmsWorkRequest.WorkType.Name,
  1063. Id = x.SiteId.ToString() + "-" + x.WorkRequestId.ToString(),
  1064. GroupId = x.FmsWorkRequest.WorkTypeId,
  1065. Type = "진행",
  1066. WorkRequestId = x.WorkRequestId,
  1067. });
  1068. return list;
  1069. }
  1070. private IList<CalendarBackground> _GetHolidayList(int siteId, int year, int month, DateTime startDate, DateTime endDate) {
  1071. var list = new List<CalendarBackground>();
  1072. var holidays = _context.CmHoliday.Where(
  1073. x => x.SiteId == siteId
  1074. && x.IsUse == true
  1075. );
  1076. foreach (var item in holidays) {
  1077. if (item.IsLunar) {
  1078. var solar = LunarSolarConverter.LunarToSolar(new Lunar() {
  1079. lunarYear = year,
  1080. lunarMonth = item.HolidayMonth,
  1081. lunarDay = item.HolidayDay
  1082. });
  1083. list.Add(new CalendarBackground {
  1084. Title = item.Name + "(음력)",
  1085. Date = new DateTime(solar.solarYear, solar.solarMonth, solar.solarDay).ToString("yyyy-MM-dd"),
  1086. Type = "공휴일",
  1087. });
  1088. } else {
  1089. list.Add(new CalendarBackground {
  1090. Title = item.Name,
  1091. Date = new DateTime(year, item.HolidayMonth, item.HolidayDay).ToString("yyyy-MM-dd"),
  1092. Type = "공휴일",
  1093. });
  1094. }
  1095. }
  1096. var query = from x in _context.CmHolidayCustom
  1097. where x.SiteId == siteId
  1098. where x.HolidayDate.Date >= startDate.Date && x.HolidayDate >= endDate.Date
  1099. select x;
  1100. var customs = query.Select(x => new CalendarBackground {
  1101. Title = x.Name,
  1102. Date = x.HolidayDate.ToString("yyyy-MM-dd"),
  1103. Type = "휴일",
  1104. });
  1105. return list;
  1106. }
  1107. /**
  1108. * 작업 현황(상태별)
  1109. */
  1110. [HttpGet("[action]")]
  1111. public IActionResult WorkStateSummary(int? siteId) {
  1112. if (siteId == null) siteId = User.GetSiteId();
  1113. var today = DateTime.Now.Date;
  1114. var startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
  1115. var endDate = startDate.AddMonths(1).AddDays(-1);
  1116. //작업 대기
  1117. var wating = (from x in _context.FmsWorkRequest
  1118. where x.SiteId == siteId
  1119. where x.StartWorkDate.Date >= startDate && x.StartWorkDate.Date <= endDate
  1120. where new int[] { 3 }.Contains(x.WorkProgress.WorkProgressId) // 3:대기
  1121. select x).Count();
  1122. // 작업 진행
  1123. var working = (from x in _context.FmsWorkResult
  1124. where x.SiteId == siteId
  1125. //where x.StartDate.Date >= startDate && x.StartDate.Date <= endDate
  1126. where x.EndDate.Date >= startDate && x.StartDate.Date <= endDate
  1127. where new int[] { 4 }.Contains(x.FmsWorkRequest.WorkProgress.WorkProgressId) // 4:진행
  1128. select x).Count();
  1129. // 작업 보류
  1130. var holding = (from x in _context.FmsWorkResult
  1131. where x.SiteId == siteId
  1132. where x.StartDate.Date >= startDate && x.StartDate.Date <= endDate
  1133. where new int[] { 7 }.Contains(x.FmsWorkRequest.WorkProgress.WorkProgressId) // 7:보류
  1134. select x).Count();
  1135. // 작업 완료
  1136. var completed = (from x in _context.FmsWorkResult
  1137. where x.SiteId == siteId
  1138. where x.EndDate.Date >= startDate && x.StartDate.Date <= endDate
  1139. where new int[] { 5 }.Contains(x.FmsWorkRequest.WorkProgress.WorkProgressId) // 5:완료
  1140. select x).Count();
  1141. // 작업 승인
  1142. var approvaled = (from x in _context.FmsWorkResult
  1143. where x.SiteId == siteId
  1144. where x.EndDate.Date >= startDate && x.StartDate.Date <= endDate
  1145. where new int[] { 6 }.Contains(x.FmsWorkRequest.WorkProgress.WorkProgressId) // 6:승인
  1146. select x).Count();
  1147. // 미결 일별보고서
  1148. var unapprovalReport = (from x in _context.FmsDailyReport
  1149. where x.SiteId == siteId
  1150. where x.AddDate.Date == today
  1151. where x.ApproverUserId == null
  1152. select x).Count();
  1153. return Ok(new {
  1154. work = new {
  1155. 작업대기 = wating,
  1156. 작업진행 = working,
  1157. 작업완료 = completed,
  1158. 작업승인 = approvaled,
  1159. 작업보류 = holding,
  1160. },
  1161. report = new {
  1162. 미결일지 = unapprovalReport
  1163. }
  1164. });
  1165. }
  1166. /**
  1167. * (시설관리>업무분야별 작업현황)
  1168. */
  1169. [HttpGet("[action]")]
  1170. public IActionResult BusinessWorkSummary(int? siteId) {
  1171. if (siteId == null) siteId = User.GetSiteId();
  1172. var startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
  1173. var endDate = startDate.AddMonths(1).AddDays(-1);
  1174. var query = from x in _context.FmsWorkResult
  1175. where x.SiteId == siteId
  1176. where x.EndDate.Date >= startDate && x.EndDate.Date <= endDate
  1177. select new {
  1178. x.FmsWorkRequest,
  1179. x.FmsWorkRequest.WorkProgress,
  1180. x.FmsWorkRequest.CmBusinessField,
  1181. };
  1182. var groupQuery = from x in query
  1183. group x by new { x.FmsWorkRequest.WorkProgressId, x.FmsWorkRequest.BusinessFieldId } into g
  1184. select new {
  1185. BusinessFieldId = g.Key.BusinessFieldId,
  1186. BusinessFieldName = g.Min(x => x.CmBusinessField.Name),
  1187. WorkProgressId = g.Key.WorkProgressId,
  1188. WorkProgressName = g.Min(x => x.WorkProgress.Name),
  1189. Count = g.Count(),
  1190. };
  1191. var groupBusiness = from x in groupQuery
  1192. group x by x.BusinessFieldId into g
  1193. select new {
  1194. BusinessFieldId = g.Key,
  1195. BusinessFieldName = g.Min(x => x.BusinessFieldName),
  1196. 작업대기 = g.Sum(x => x.WorkProgressId == 3 ? x.Count : 0),
  1197. 작업진행 = g.Sum(x => x.WorkProgressId == 4 ? x.Count : 0),
  1198. 작업완료 = g.Sum(x => x.WorkProgressId == 5 ? x.Count : 0),
  1199. 작업승인 = g.Sum(x => x.WorkProgressId == 6 ? x.Count : 0),
  1200. 작업보류 = g.Sum(x => x.WorkProgressId == 7 ? x.Count : 0),
  1201. };
  1202. return Ok(new {
  1203. year = startDate.Year,
  1204. month = startDate.Month,
  1205. list = groupBusiness
  1206. });
  1207. }
  1208. /**
  1209. * 월별 작업 현황 (관리자)
  1210. */
  1211. [HttpGet("[action]")]
  1212. public IActionResult MonthlyWorkSummary(int? siteId, int? year, int? month) {
  1213. if (siteId == null) siteId = User.GetSiteId();
  1214. DateTime startDate;
  1215. if (year == null || month == null) {
  1216. startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
  1217. } else {
  1218. startDate = new DateTime(year.Value, month.Value, 1);
  1219. }
  1220. var endDate = startDate.AddMonths(1).AddDays(-1);
  1221. var query = from x in _context.FmsWorkRequest
  1222. where x.StartWorkDate >= startDate && x.StartWorkDate <= endDate && x.SiteId == siteId
  1223. where new int[] { 1 }.Contains(x.WorkProgress.WorkProgressId)
  1224. select new {
  1225. x.Site,
  1226. x.WorkType,
  1227. x.CmBusinessField,
  1228. };
  1229. var groupQuery = from x in query
  1230. group x by new { x.WorkType.WorkTypeId, x.Site.SiteId } into g
  1231. select new {
  1232. SiteId = g.Key.SiteId,
  1233. SiteName = g.Min(x => x.Site.Name),
  1234. WorkTypeId = g.Key.WorkTypeId,
  1235. WorkTypeName = g.Min(x => x.WorkType.Name),
  1236. Count = g.Count(),
  1237. };
  1238. var groupBusiness = from x in groupQuery
  1239. group x by x.SiteId into g
  1240. select new {
  1241. SiteId = g.Key,
  1242. SiteName = g.Min(x => x.SiteName),
  1243. 정기점검 = g.Sum(x => x.WorkTypeId == 1 ? x.Count : 0),
  1244. 법정검사 = g.Sum(x => x.WorkTypeId == 2 ? x.Count : 0),
  1245. 수시점검 = g.Sum(x => x.WorkTypeId == 5 ? x.Count : 0),
  1246. 공사작업 = g.Sum(x => x.WorkTypeId == 6 ? x.Count : 0),
  1247. 법정교육 = g.Sum(x => x.WorkTypeId == 7 ? x.Count : 0),
  1248. };
  1249. return Ok(new {
  1250. // year = startDate.Year,
  1251. // month = startDate.Month,
  1252. work = new {
  1253. 정기점검 = groupBusiness.Select(x => x.정기점검).FirstOrDefault(),
  1254. 법정검사 = groupBusiness.Select(x => x.법정검사).FirstOrDefault(),
  1255. 수시점검 = groupBusiness.Select(x => x.수시점검).FirstOrDefault(),
  1256. 공사작업 = groupBusiness.Select(x => x.공사작업).FirstOrDefault(),
  1257. 법정교육 = groupBusiness.Select(x => x.법정교육).FirstOrDefault(),
  1258. }
  1259. });
  1260. }
  1261. // 작업 계획/승인 달력 상세(리스트)
  1262. [HttpGet("[action]")]
  1263. public IActionResult CustomAllList([FromQuery] PagingRequest req, DateTime dates) {
  1264. DateTime selectMonth;
  1265. selectMonth = new DateTime(dates.Year, dates.Month, dates.Day);
  1266. var startDate = selectMonth;
  1267. var endDate = selectMonth.AddDays(1).AddSeconds(-1);
  1268. var query = _service.GetCustomRequestResultList(null, startDate, endDate);
  1269. var list = query.OrderBy(x => x.Site.SortOrderNo).Select(x => new {
  1270. Title = "[" + x.Site.Name + "] " + x.Title,
  1271. x.SiteId,
  1272. x.WorkRequestId,
  1273. x.WorkTypeId,
  1274. x.WorkScheduleId,
  1275. x.WorkProgressId,
  1276. IsConfirmName = x.WorkProgressId == 6 ? "완료" : "",
  1277. });
  1278. var paging = PagingList.Pagination(list, req.page, req.limit);
  1279. return Ok(paging);
  1280. }
  1281. // 작업 계획/승인 달력 상세(리스트)
  1282. [HttpGet("[action]")]
  1283. public IActionResult CustomAllListSite([FromQuery] PagingRequest req, int siteId, DateTime dates) {
  1284. DateTime selectMonth;
  1285. selectMonth = new DateTime(dates.Year, dates.Month, dates.Day);
  1286. var startDate = selectMonth;
  1287. var endDate = selectMonth.AddDays(1).AddSeconds(-1);
  1288. var query = _service.GetCustomRequestResultList(siteId, startDate, endDate);
  1289. var list = query.Select(x => new {
  1290. x.Title,
  1291. x.SiteId,
  1292. x.WorkRequestId,
  1293. x.WorkTypeId,
  1294. x.WorkScheduleId,
  1295. x.WorkProgressId,
  1296. IsConfirmName = x.WorkProgressId == 6 ? "완료" : "",
  1297. });
  1298. var paging = PagingList.Pagination(list, req.page, req.limit);
  1299. return Ok(paging);
  1300. }
  1301. }
  1302. }