| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 | 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<FmsWorkScheduleToFacility> 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);        }    }}
 |