using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Diagnostics; using System.Linq; using System.Net; using System.Net.Http; using System.Web; using System.Web.Http; using System.Web.Http.Description; using DevExpress.XtraCharts.Native; using DevExpress.XtraPrinting.Native; using iBemsDataService; using iBemsDataService.Model; using iBemsDataService.Util; using System.Transactions; namespace iBemsDataService.Controllers { public class FmsWorkRequestController : ApiController { private iBemsEntities db = new iBemsEntities(); // POST: api/FmsWorkRequest [ActionName("ExecutionPlanGeneration")] [ResponseType(typeof(void))] public IHttpActionResult GetFmsWorkRequest() { if (!ModelState.IsValid) { return BadRequest(ModelState); } // 2019.07.12 Uri uri = Request.RequestUri; var uriQuery = HttpUtility.ParseQueryString(uri.Query); int siteId; if (int.TryParse(uriQuery.Get("SiteId"), out siteId) == false) { return BadRequest("Not Found Parameters."); } var today = DateTime.Now.Date; var tomorrow = today.AddDays(1); using (var transaction = new TransactionScope()) { // 내일이 작업예정일이고 오늘 생성된 실행계획(작업요청)이 없다면 실행계획을 생성해야 하는 기초계획이다. var query = from s in db.FmsWorkSchedule where s.IsUse == true && s.WorkDueDate == tomorrow && db.FmsWorkRequest.Where(x => x.SiteId == siteId && // 2019.07.12 x.WorkScheduleId == s.WorkScheduleId && x.RequestDate == today).Any() == false select s; foreach (var s in query) { var workRequest = new FmsWorkRequest { SiteId = s.SiteId, WorkScheduleId = s.WorkScheduleId, WorkTypeId = s.WorkTypeId, BusinessFieldId = s.BusinessFieldId, WorkProgressId = (short)WorkProgress.WORK_PLAN, Title = s.Name, RequestDate = today, StartWorkDate = s.WorkDueDate, RequestUserId = s.UpdateUserId, InspectionAgencyId = s.InspectionAgencyId }; workRequest = db.FmsWorkRequest.Add(workRequest); db.SaveChanges(); // 기초계획에 설정된 시설들도 옮겨준다. var facilitiesQuery = from f in db.FmsWorkScheduleToFacility where f.SiteId == s.SiteId && f.WorkScheduleId == s.WorkScheduleId select f; var facilities = facilitiesQuery.ToList(); foreach (var f in facilities) { db.FmsWorkRequestToFacility.Add(new FmsWorkRequestToFacility { SiteId = f.SiteId, WorkRequestId = workRequest.WorkRequestId, FacilityCode = f.FacilityCode }); } db.SaveChanges(); // chl 수정(20161021) //// 작업지시가 자동이면 작업지시도 생성 //if (s.IsAutoOrder) //{ // InsertWorkOrder(workRequest, facilities); //} } transaction.Complete(); } return StatusCode(HttpStatusCode.NoContent); } [ResponseType(typeof(void))] [ActionName("Approval")] public IHttpActionResult PostFmsWorkRequest() { Uri uri = Request.RequestUri; var uriQuery = HttpUtility.ParseQueryString(uri.Query); int siteId, workRequestId, workProgressId; bool isConfirmDueDate = false; DateTime confirmDueDate = new DateTime(); if (int.TryParse(uriQuery.Get("SiteId"), out siteId) == false || int.TryParse(uriQuery.Get("WorkRequestId"), out workRequestId) == false || int.TryParse(uriQuery.Get("WorkProgressId"), out workProgressId) == false || string.IsNullOrEmpty(uriQuery.Get("UserId")) ) { return BadRequest("Not Found Parameters."); } string userId = uriQuery.Get("UserId"); // WorkRequest progressid 업데이트 필요 try { using (var transaction = new TransactionScope()) { var updateRequest = ( from u in db.FmsWorkRequest where u.SiteId == siteId && u.WorkRequestId == workRequestId select u).FirstOrDefault(); if (updateRequest != null) { updateRequest.WorkProgressId = workProgressId; if (updateRequest.WorkScheduleId != null) { // FmsWorkSchedule update... bool.TryParse(uriQuery.Get("IsConfirmDueDate"), out isConfirmDueDate); DateTime.TryParse(uriQuery.Get("ConfirmDueDate"), out confirmDueDate); // userId = uriQuery.Get("UserId"); if (isConfirmDueDate) { var updateSchedule = ( from us in db.FmsWorkSchedule where us.SiteId == siteId && us.WorkScheduleId == updateRequest.WorkScheduleId && us.IsUse == true select us) .FirstOrDefault(); if (updateSchedule != null) { updateSchedule.WorkDueDate = confirmDueDate; } } } if (workProgressId == 6) // 완료승인인 경우에만 수행 { var workResultMaterials = ( from wm in db.FmsWorkResultCheckItemMaterial where wm.SiteId == siteId && wm.WorkRequestId == workRequestId select wm).ToList(); foreach (var item in workResultMaterials) { var material = db.FmsMaterial.Where(m => m.SiteId == siteId && m.MaterialId == item.MaterialId && m.IsUse == true ).FirstOrDefault(); if (material == null) { continue; } FmsMaterialRelease releaseItem = new FmsMaterialRelease() { SiteId = item.SiteId, BusinessFieldId = updateRequest.BusinessFieldId, ReleaseDate = DateTime.Now, ReleaseTypeId = 1, // 작업출고 WorkRequestId = workRequestId, MaterialId = item.MaterialId, MaterialCount = item.MaterialCount, //// TODO : 선입선출에 따른 계산이 필요함 ReleaseTotalCost = 0, ConfirmedUserId = userId, ConfirmedDate = DateTime.Now, IsConfirmed = true, AdjustmentTypeId = 0 }; // 선입선출에 따른 계산 var currentStoredList = db.FmsMaterialStored .Where(ms => ms.IsApproval == true && ms.MaterialId == item.MaterialId && ms.RemainStoredCount > 0) .OrderBy(s => s.StoredDate) .ToList(); var tempReleasedItemCount = item.MaterialCount; foreach (var storedItem in currentStoredList) { if ((storedItem.RemainStoredCount - tempReleasedItemCount) >= 0) { releaseItem.ReleaseTotalCost += (storedItem.UnitCost * tempReleasedItemCount); storedItem.RemainStoredCount -= tempReleasedItemCount; break; } releaseItem.ReleaseTotalCost += (storedItem.UnitCost * storedItem.RemainStoredCount); tempReleasedItemCount -= storedItem.RemainStoredCount; storedItem.RemainStoredCount = 0; } db.FmsMaterialRelease.Add(releaseItem); } } } db.SaveChanges(); transaction.Complete(); } } catch (DbUpdateException e) { throw e; } return StatusCode(HttpStatusCode.NoContent); } private void InsertWorkOrder(FmsWorkRequest workRequest, List facilities) { var workOrder = new FmsWorkOrder { SiteId = workRequest.SiteId, WorkRequestId = workRequest.WorkRequestId, BusinessFieldId = workRequest.BusinessFieldId, OrderUserId = workRequest.RequestUserId, OrderDate = DateTime.Now.Date, Title = workRequest.Title, Content = workRequest.Content, StartWorkDate = workRequest.StartWorkDate }; workOrder = db.FmsWorkOrder.Add(workOrder); foreach (var f in facilities) { db.FmsWorkOrderToFacility.Add(new FmsWorkOrderToFacility { SiteId = f.SiteId, WorkRequestId = workOrder.WorkRequestId, FacilityCode = f.FacilityCode }); } workRequest.WorkProgressId = (short)WorkProgress.WORK_STANDBY; db.SaveChanges(); } protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } } }