WorkResultController.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  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.Collections.Generic;
  16. using LinqKit;
  17. namespace FMSApp.Controllers {
  18. [Authorize]
  19. [ApiController]
  20. [ApiVersion("1")]
  21. [Route("api/app/[controller]")]
  22. public class WorkResultController : Controller {
  23. private readonly ILogger<WorkResultController> _logger;
  24. private readonly FMSContext _context;
  25. private readonly WorkResultService _service;
  26. private readonly StorageHelper _storage;
  27. public WorkResultController(
  28. ILogger<WorkResultController> logger,
  29. FMSContext context,
  30. WorkResultService service,
  31. StorageHelper storage
  32. ) {
  33. _logger = logger;
  34. _context = context;
  35. _service = service;
  36. _storage = storage;
  37. }
  38. /// <summary>
  39. /// 작업진행목록 / 작업완료목록 조회
  40. /// </summary>
  41. [HttpGet]
  42. public IActionResult List([FromQuery] PagingRequest req, [FromQuery] string siteId, [FromQuery] string workProgressId, bool businessAuth) {
  43. int nWorkProgressId = 0;
  44. int.TryParse(workProgressId, out nWorkProgressId);
  45. if (nWorkProgressId != 0 && nWorkProgressId != 4 && nWorkProgressId != 5) {
  46. throw new ServiceException("입력 파라메터가 잘못되었습니다.(WorkProgress:0/4/5)");
  47. }
  48. var query = _FilterAndSort(req);
  49. query = BusinessFieldHelper.Apply<FmsWorkResult>(_context, User, businessAuth, query, "FmsWorkOrder");
  50. query = query.Where(
  51. x => x.SiteId == Util.ToInt(siteId)
  52. );
  53. if (nWorkProgressId == 4) {
  54. // 작업진행 목록에서는 작업진행(4), 작업보류(7) 데이터를 조회
  55. query = query.Where(x => (x.FmsWorkRequest.WorkProgressId == 4 || x.FmsWorkRequest.WorkProgressId == 7));
  56. }
  57. if (nWorkProgressId == 5) {
  58. // 작업완료 목록에서는 작업완료(5) 데이터를 조회
  59. query = query.Where(x => x.FmsWorkRequest.WorkProgressId == 5);
  60. }
  61. if (nWorkProgressId == 0) {
  62. // 작업진행/작업완료 통합에 의해 작업진행(4), 작업완료(5), 작업보류 데이터조회 되도록
  63. query = query.Where(x => (new int[] { 4, 5, 7 }).Contains(x.FmsWorkRequest.WorkProgressId));
  64. }
  65. var list = query.Select(x => new {
  66. x.SiteId,
  67. x.WorkRequestId,
  68. x.FmsWorkRequest.WorkProgressId,
  69. WorkProgress = new {
  70. x.FmsWorkRequest.WorkProgress.Name
  71. },
  72. x.FmsWorkRequest.WorkTypeId,
  73. WorkType = new {
  74. x.FmsWorkRequest.WorkType.Name
  75. },
  76. x.FmsWorkOrder.BusinessFieldId,
  77. BusinessField = new {
  78. x.FmsWorkOrder.CmBusinessField.Name
  79. },
  80. x.FmsWorkOrder.Title,
  81. x.Content,
  82. OrderContent = x.FmsWorkOrder.Content,
  83. RequestContent = x.FmsWorkRequest.Content,
  84. x.StartDate,
  85. x.EndDate,
  86. x.FmsWorkOrder.OrderDate,
  87. x.FmsWorkOrder.StartWorkDate,
  88. x.FmsWorkOrder.OrderUserId,
  89. OrderUser = new {
  90. x.FmsWorkOrder.CmUser.Name
  91. },
  92. x.WorkerUserId,
  93. WorkerUser = new {
  94. x.CmUserNavigation.Name
  95. },
  96. x.IsConfirmed,
  97. x.ConfirmedUserId,
  98. ConfirmedUser = new {
  99. x.CmUser.Name
  100. },
  101. WorkPartnerName = x.FmsWorkRequest.WorkPartner.Name,
  102. x.FmsWorkRequest.WorkPrice,
  103. x.FmsWorkRequest.WorkItem,
  104. x.FmsWorkRequest.WorkEndDate,
  105. HasCheckItem = x.FmsWorkResultCheckItem.Any()
  106. });
  107. var paging = PagingList.Pagination(list, req.page, req.limit);
  108. return Ok(paging);
  109. }
  110. /// <summary>
  111. /// 작업진행달력
  112. /// </summary>
  113. [HttpGet("[action]")]
  114. public IActionResult CalendarList([FromQuery] PagingRequest req, [FromQuery] string siteId, [FromQuery] int year, [FromQuery] int month, bool businessAuth) {
  115. DateTime target = new DateTime(year, month, 1);
  116. DateTime start = target.AddMonths(-1);
  117. DateTime end = target.AddMonths(2).AddDays(-1);
  118. var query = _FilterAndSort(req);
  119. query = BusinessFieldHelper.Apply<FmsWorkResult>(_context, User, businessAuth, query, "FmsWorkOrder");
  120. query = query.Where(
  121. x => x.SiteId == Util.ToInt(siteId)
  122. && (new int[] { 4, 7 }).Contains(x.FmsWorkRequest.WorkProgressId)
  123. && x.StartDate <= end
  124. && x.EndDate >= start
  125. );
  126. var list = query.Select(x => new {
  127. x.SiteId,
  128. x.WorkRequestId,
  129. x.FmsWorkRequest.WorkProgressId,
  130. WorkProgress = new {
  131. x.FmsWorkRequest.WorkProgress.Name
  132. },
  133. x.FmsWorkRequest.WorkTypeId,
  134. WorkTypeName = x.FmsWorkRequest.WorkType.Name,
  135. x.FmsWorkOrder.BusinessFieldId,
  136. BusinessField = new {
  137. x.FmsWorkOrder.CmBusinessField.Name
  138. },
  139. x.FmsWorkOrder.Title,
  140. x.Content,
  141. OrderContent = x.FmsWorkOrder.Content,
  142. RequestContent = x.FmsWorkRequest.Content,
  143. x.StartDate,
  144. x.EndDate,
  145. x.FmsWorkOrder.OrderDate,
  146. x.FmsWorkOrder.StartWorkDate,
  147. x.FmsWorkOrder.OrderUserId,
  148. OrderUser = new {
  149. x.FmsWorkOrder.CmUser.Name
  150. },
  151. x.WorkerUserId,
  152. WorkerUser = new {
  153. x.CmUserNavigation.Name
  154. },
  155. x.IsConfirmed,
  156. x.ConfirmedUserId,
  157. ConfirmedUser = new {
  158. x.CmUser.Name
  159. },
  160. });
  161. return Ok(list);
  162. }
  163. /// <summary>
  164. /// 항목조회
  165. /// </summary>
  166. [HttpGet("[action]")]
  167. public IActionResult Get([FromQuery] string siteId, [FromQuery] string workRequestId) {
  168. var query = _service.GetAll()
  169. .Where(x => x.SiteId == Util.ToInt(siteId) && x.WorkRequestId == Util.ToInt(workRequestId));
  170. var item = query.Select(x => new {
  171. x.SiteId,
  172. x.WorkRequestId,
  173. x.FmsWorkRequest.WorkScheduleId,
  174. x.FmsWorkRequest.WorkProgressId,
  175. x.FmsWorkRequest.WorkDetailTypeId,
  176. WorkDetailType = new {
  177. x.FmsWorkRequest.WorkDetailType.Code,
  178. x.FmsWorkRequest.WorkDetailType.Name,
  179. },
  180. WorkProgress = new {
  181. x.FmsWorkRequest.WorkProgress.Name
  182. },
  183. x.FmsWorkRequest.WorkTypeId,
  184. WorkType = new {
  185. x.FmsWorkRequest.WorkType.Name
  186. },
  187. x.FmsWorkOrder.BusinessFieldId,
  188. BusinessField = new {
  189. x.FmsWorkOrder.CmBusinessField.Name
  190. },
  191. x.FmsWorkOrder.Title,
  192. x.Content,
  193. FmsWorkOrder = new {
  194. x.FmsWorkOrder.Content,
  195. },
  196. FmsWorkRequest = new {
  197. x.FmsWorkRequest.Content,
  198. },
  199. x.StartDate,
  200. x.EndDate,
  201. x.FmsWorkOrder.OrderDate,
  202. x.FmsWorkOrder.StartWorkDate,
  203. WorkDueDate = (x.FmsWorkRequest.FmsWorkSchedule == null ? x.FmsWorkRequest.StartWorkDate : x.FmsWorkRequest.FmsWorkSchedule.WorkDueDate),
  204. x.FmsWorkOrder.OrderUserId,
  205. OrderUser = new {
  206. x.FmsWorkOrder.CmUser.Name
  207. },
  208. x.WorkerUserId,
  209. WorkerUser = new {
  210. x.CmUserNavigation.Name
  211. },
  212. x.IsConfirmed,
  213. x.ConfirmedUserId,
  214. ConfirmedUser = new {
  215. x.CmUser.Name
  216. },
  217. x.ConfirmDesc,
  218. x.FmsWorkRequest.WorkPartnerId,
  219. WorkPartnerName = x.FmsWorkRequest.WorkPartner.Name,
  220. x.FmsWorkRequest.WorkPrice,
  221. x.FmsWorkRequest.WorkItem,
  222. x.FmsWorkRequest.WorkEndDate,
  223. CmFile = _storage.ParseFile(x.FmsWorkRequest.CmFile),
  224. HasCheckItem = x.FmsWorkResultCheckItem.Any(),
  225. FmsWorkResultToFacility = x.FmsWorkResultToFacility.Select(f => new {
  226. f.SiteId,
  227. f.WorkRequestId,
  228. f.FacilityCode,
  229. CmFacility = new {
  230. f.CmFacility.Name,
  231. f.CmFacility.BuildingId,
  232. CmBuilding = new {
  233. f.CmFacility.CmBuilding.Name,
  234. },
  235. f.CmFacility.FloorId,
  236. CmFloor = new {
  237. f.CmFacility.CmFloor.Name,
  238. },
  239. f.CmFacility.FirstClassId,
  240. FirstClass = new {
  241. f.CmFacility.FmsFacilityCodeClass.Name,
  242. },
  243. f.CmFacility.SecondClassId,
  244. SecondClass = new {
  245. f.CmFacility.FmsFacilityCodeClass1.Name,
  246. },
  247. f.CmFacility.ThirdClassId,
  248. ThirdClass = new {
  249. f.CmFacility.FmsFacilityCodeClass2.Name,
  250. },
  251. },
  252. }).ToList(),
  253. FmsWorkRequestToAccident = x.FmsWorkRequest.FmsWorkRequestToAccident.Select(f => new {
  254. f.SiteId,
  255. f.WorkRequestId,
  256. f.AccidentId,
  257. FmsAccident = new {
  258. f.FmsAccident.SiteId,
  259. f.FmsAccident.AccidentId,
  260. f.FmsAccident.Name,
  261. f.FmsAccident.AccidentTypeId,
  262. AccidentTypeName = f.FmsAccident.FmsAccidentCodeType.Name,
  263. Dates = new {
  264. StartDate = f.FmsAccident.StartDate == null ? null : ((DateTime)f.FmsAccident.StartDate).ToString("yyyy.MM.dd"),
  265. EndDate = f.FmsAccident.EndDate == null ? null : ((DateTime)f.FmsAccident.EndDate).ToString("yyyy.MM.dd"),
  266. },
  267. f.FmsAccident.DepartmentId,
  268. DepartmentName = f.FmsAccident.CmDepartment.Name,
  269. f.FmsAccident.AccidentLocation,
  270. },
  271. }).ToList(),
  272. FmsWorkRequestToComplaint = x.FmsWorkRequest.FmsWorkRequestToComplaint.Select(f => new {
  273. f.SiteId,
  274. f.WorkRequestId,
  275. f.ComplaintId,
  276. FmsComplaints = new {
  277. f.FmsComplaints.SiteId,
  278. f.FmsComplaints.ComplaintId,
  279. f.FmsComplaints.Name,
  280. f.FmsComplaints.ComplaintTypeId,
  281. ComplaintTypeName = f.FmsComplaints.FmsComplaintCodeType.Name,
  282. Dates = new {
  283. StartDate = f.FmsComplaints.StartDate == null ? null : ((DateTime)f.FmsComplaints.StartDate).ToString("yyyy.MM.dd"),
  284. EndDate = f.FmsComplaints.EndDate == null ? null : ((DateTime)f.FmsComplaints.EndDate).ToString("yyyy.MM.dd"),
  285. },
  286. f.FmsComplaints.DepartmentId,
  287. DepartmentName = f.FmsComplaints.CmDepartment.Name,
  288. f.FmsComplaints.ComplaintLocation,
  289. },
  290. }).ToList(),
  291. }).FirstOrDefault();
  292. return Ok(item);
  293. }
  294. /// <summary>
  295. /// 작업내 사용 자재목록 조회
  296. /// </summary>
  297. [HttpGet("[action]")]
  298. public IActionResult Materials([FromQuery] PagingRequest req, [FromQuery] string siteId, [FromQuery] string workRequestId) {
  299. var query = _context.FmsWorkResultCheckItemMaterial as IQueryable<FmsWorkResultCheckItemMaterial>;
  300. query = query.Filter(req.conditions);
  301. query = query.Sort(req.sort);
  302. query = query.Where(
  303. x => x.SiteId == Util.ToInt(siteId)
  304. && x.WorkRequestId == Util.ToInt(workRequestId)
  305. );
  306. var list = query.Select(x => new {
  307. x.FmsMaterial.Name,
  308. x.FmsMaterial.Standard,
  309. x.MaterialCount,
  310. });
  311. return Ok(list);
  312. }
  313. /// <summary>
  314. /// 작업이력 조회
  315. /// </summary>
  316. [HttpGet("[action]")]
  317. public IActionResult CheckItems([FromQuery] PagingRequest req, [FromQuery] string siteId, [FromQuery] string workRequestId) {
  318. var query = _context.FmsWorkResultCheckItem as IQueryable<FmsWorkResultCheckItem>;
  319. query = query.Filter(req.conditions);
  320. query = query.Sort(req.sort);
  321. query = query.Where(
  322. x => x.SiteId == Util.ToInt(siteId)
  323. && x.WorkRequestId == Util.ToInt(workRequestId)
  324. );
  325. var list = query.Select(x => new {
  326. x.SiteId,
  327. x.WorkRequestId,
  328. x.CheckItemId,
  329. x.CheckDate,
  330. x.TextResult,
  331. x.BoolResult,
  332. CmFile1 = _storage.ParseFile(x.CmFile1),
  333. CmFile2 = _storage.ParseFile(x.CmFile2),
  334. });
  335. return Ok(list);
  336. }
  337. /// <summary>
  338. /// 작업이력 항목 조회 (이력 내 사용 자재목록 포함하여 조회)
  339. /// </summary>
  340. [HttpGet("[action]")]
  341. public IActionResult GetCheckItem([FromQuery] string siteId, [FromQuery] string workRequestId, [FromQuery] string checkItemId) {
  342. var query = _context.FmsWorkResultCheckItem.AsExpandable() as IQueryable<FmsWorkResultCheckItem>;
  343. query = query.Where(
  344. x => x.SiteId == Util.ToInt(siteId)
  345. && x.WorkRequestId == Util.ToInt(workRequestId)
  346. && x.CheckItemId == Util.ToInt(checkItemId)
  347. );
  348. var item = query.Select(x => new {
  349. x.SiteId,
  350. x.WorkRequestId,
  351. x.CheckItemId,
  352. x.CheckDate,
  353. x.TextResult,
  354. x.BoolResult,
  355. CmFile1 = _storage.ParseFile(x.CmFile1),
  356. CmFile2 = _storage.ParseFile(x.CmFile2),
  357. WorkProgressId = x.FmsWorkResult.FmsWorkRequest.WorkProgressId,
  358. FmsWorkResultCheckItemMaterial = x.FmsWorkResultCheckItemMaterial.Select(f => new {
  359. f.CheckItemId,
  360. f.CheckItemMaterialId,
  361. f.MaterialId,
  362. f.MaterialCode,
  363. f.MaterialCount,
  364. f.Name,
  365. FmsMaterial = new {
  366. f.FmsMaterial.MaterialId,
  367. f.FmsMaterial.MaterialCode,
  368. f.FmsMaterial.Name,
  369. f.FmsMaterial.Standard,
  370. f.FmsMaterial.Unit,
  371. },
  372. StockCount = FmsMaterial.GetStockCount.Invoke(f.FmsMaterial),
  373. StockAmount = FmsMaterial.GetStockAmount.Invoke(f.FmsMaterial),
  374. }).ToList()
  375. }).FirstOrDefault();
  376. return Ok(item);
  377. }
  378. /// <summary>
  379. /// 작업이력 저장 (완료처리 및 보류처리 포함)
  380. /// </summary>
  381. [HttpPost("[action]")]
  382. public IActionResult SaveCheckItem([FromBody] FmsWorkResultCheckItem data) {
  383. _logger.LogInformation("Save");
  384. //_logger.LogInformation(data.Dump());
  385. ModelState.RemoveStartOf("CmFile1");
  386. ModelState.RemoveStartOf("CmFile2");
  387. ModelState.RemoveStartOf("FmsWorkResultCheckItemMaterial");
  388. if (ModelState.IsValid) {
  389. _service.SaveCheckItem(data, User.Identity.Name);
  390. } else {
  391. return BadRequest(ModelState);
  392. }
  393. return Ok();
  394. }
  395. /// <summary>
  396. /// 작업진행(보류해제)
  397. /// </summary>
  398. [HttpPost("[action]")]
  399. public IActionResult Continue([FromBody] FmsWorkResult data) {
  400. _service.Continue(data);
  401. return Ok();
  402. }
  403. /// <summary>
  404. /// 작업완료
  405. /// </summary>
  406. [HttpPost("[action]")]
  407. public IActionResult Complete([FromBody] FmsWorkResult data) {
  408. _service.CompleteWithAdditionalData(data);
  409. return Ok();
  410. }
  411. /// <summary>
  412. /// 작업보류
  413. /// </summary>
  414. [HttpPost("[action]")]
  415. public IActionResult Hold([FromBody] FmsWorkRequest data) {
  416. _service.Hold(data);
  417. return Ok();
  418. }
  419. /// <summary>
  420. /// 승인
  421. /// </summary>
  422. [HttpPost("[action]")]
  423. public IActionResult Confirm([FromBody] FmsWorkResult data, [FromQuery] DateTime? date) {
  424. _service.Confirm(data, date);
  425. return Ok();
  426. }
  427. /// <summary>
  428. /// 차기작업 확정일자 및 현작업 종료일자 조회
  429. /// { WorkDueDate, EndDate }
  430. /// </summary>
  431. [HttpGet("[action]")]
  432. public IActionResult GetAvailDueDate([FromQuery] string siteId, [FromQuery] string workRequestId) {
  433. return Ok(_service.GetAvailDueDate(Util.ToInt(siteId), Util.ToInt(workRequestId)));
  434. }
  435. [HttpDelete("{siteId}/{workRequestId}")]
  436. public IActionResult Delete(int siteId, int workRequestId) {
  437. _service.Delete(siteId, workRequestId);
  438. return Ok();
  439. }
  440. // 검색 & 정렬 공통
  441. private IQueryable<FmsWorkResult> _FilterAndSort(PagingRequest req) {
  442. var query = _service.GetAll();
  443. // 기본 Entity 검색
  444. query = query.Filter(req.conditions);
  445. // 기본 Entity 정렬
  446. if (Util.V(req, x => x.sort.field) == "Custom") {
  447. query = query.OrderByDescending(x => x.StartDate).ThenBy(x => x.FmsWorkRequest.Title);
  448. } else {
  449. query = query.Sort(req.sort);
  450. }
  451. return query;
  452. }
  453. }
  454. }