using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Net; using System.Transactions; using System.Web; using System.Web.Http; using System.Web.Http.Description; using iBemsDataService.Model; using iBemsDataService.Util; using System.Diagnostics; namespace iBemsDataService.Controllers.Fms.CheckSchedule { public class FmsWorkOrderController : ApiController { private iBemsEntities db = new iBemsEntities(); private const int WORK_ORDER = 3; private const int WORK_STANDBY = 4; private const int EMERGENCY_B = 1; // POST: api/FmsWorkOrderController/GenerateWorkRequestOrder [ActionName( "GenerateWorkRequestOrder" )] [ResponseType( typeof ( void ) )] public IHttpActionResult PostGenerateWorkRequestOrder( List checkSchedules ) { if ( !ModelState.IsValid ) { return BadRequest( ModelState ); } /* Uri uri = Request.RequestUri; var uriQuery = HttpUtility.ParseQueryString( uri.Query ); DateTime date; String userId = uriQuery.Get( "UserId" ); if( DateTime.TryParse( uriQuery.Get( "Date" ) , out date ) == false ) { return BadRequest("Not Found Parameters."); } var qm = new QueryManager( db ); try { // 선임정보가 있는 사용자 정보 목록 쿼리문을 준비한다. var querySenior = from s in db.FmsBusinessSenior from si in db.FmsBusinessSeniorItem from user in db.CmUser where s.SeniorUserId == user.UserId && s.SeniorItemId == si.SeniorItemId select new SeniorForOrder { SiteId = s.SiteId, SeniorId = s.SeniorId , SeniorUserName = user.Name , SeniorItemName = si.Name , }; // 지시 생성을 요청한 사용자 이름을 가져온다. var userInfo = db.CmUser.Select( x => new { x.UserId, x.Name } ).FirstOrDefault( x => x.UserId == userId ); using (var transaction = new TransactionScope()) { // 요청한 점검 계획 목록을 처리한다. foreach( CheckScheduleToGenerate cs in checkSchedules ) { // 요청한 점검계획, 이에 해당하는 점검그룹을 연결하고 이에 해당하는 선임이 있다면 이를 가져오는 쿼리 생성 var sQuery = from ss in db.FmsFacilitySchedule from stocg in db.FmsFacilityScheduleToCheckGroup from cg in db.FmsFacilityScheduleCheckGroup join senior in querySenior on cg.SiteId equals senior.SiteId into seniors from subSenior in seniors.Where( x => x.SeniorId == cg.SeniorId ).DefaultIfEmpty() where (ss.SiteId == cs.SiteId && ss.ScheduleId == cs.ScheduleId) && (ss.SiteId == stocg.SiteId && ss.ScheduleId == stocg.ScheduleId) && (stocg.SiteId == cg.SiteId && stocg.CheckGroupId == cg.CheckGroupId) select new FacilityScheduleForOrder { SiteId = ss.SiteId , ScheduleId = ss.ScheduleId , BusinessFieldId = ss.BusinessFieldId , ScheduleName = ss.Name , CheckGroupId = cg.CheckGroupId , WorkTypeId = cg.WorkTypeId , SeniorId = subSenior.SeniorId == null ? 0 : subSenior.SeniorId , WorkerName = subSenior.SeniorUserName == null ? string.Empty : subSenior.SeniorUserName }; if( sQuery.Any() ) { // 데이터가 존재한다면 당연히 하나의 점검계획을 가져온다. var schedule = sQuery.First(); if( userInfo != null ) { // 요청자 정보가 있다면 점검 계획 schedule.UserId = userInfo.UserId; schedule.UserName = userInfo.Name; } var workRequestQuery = db.FmsWorkRequest.Where( x => x.SiteId == schedule.SiteId && x.ScheduleId == schedule.ScheduleId && x.RequestedDate == date ); FmsWorkRequest wr = null; if( workRequestQuery.Any() ) { wr = workRequestQuery.First(); } FmsWorkOrder wo = null; if( wr != null ) { var workOrderQuery = db.FmsWorkOrder.Where( x => x.SiteId == schedule.SiteId && x.RequestId == schedule.ScheduleId && x.OrderedDate == date ); if( workOrderQuery.Any() ) { wo = workOrderQuery.First(); } } bool needInsert = false; if( wr == null ) { wr = new FmsWorkRequest(); needInsert = true; } wr.SiteId = schedule.SiteId; wr.WorkTypeId = schedule.WorkTypeId.GetValueOrDefault(); wr.BusinessFieldId = schedule.BusinessFieldId.GetValueOrDefault(); wr.ScheduleId = schedule.ScheduleId; wr.CheckGroupId = schedule.CheckGroupId; wr.ProgressId = WORK_ORDER; wr.RequesterUserId = schedule.UserId; wr.RequesterName = schedule.UserName; //wr.RequesterCompanyId = ; //wr.RequesterDepartmentId = ; //wr.RequesterPost = ; //wr.RequesterMobileNo = ; wr.Title = schedule.ScheduleName; wr.Note = schedule.ScheduleName; wr.RequestedDate = DateTime.Now; if( needInsert ) { wr = db.FmsWorkRequest.Add( wr ); db.SaveChanges(); needInsert = false; } if( wo == null ) { wo = new FmsWorkOrder(); needInsert = true; } wo.SiteId = schedule.SiteId; wo.EmergencyId = EMERGENCY_B; wo.RequestId = wr.RequestId; wo.OrderUserId = schedule.UserId; wo.OrderedDate = DateTime.Now; wo.Title = wr.Title; wo.Contents = wr.Note; wo.WorkerUserName = schedule.WorkerName; if( needInsert ) { wo = db.FmsWorkOrder.Add( wo ); db.SaveChanges(); } var facilityQueryToDelete = from wotof in db.FmsWorkOrderToFacility where wotof.SiteId == schedule.SiteId && wotof.OrderId == wo.OrderId select wotof; var facilityQuery = from sctof in db.FmsFacilityScheduleCheckGroupToFacility where sctof.SiteId == schedule.SiteId && sctof.CheckGroupId == schedule.CheckGroupId select new { FacilityCode = sctof.FacilityCode }; var list = new List(); foreach( var f in facilityQuery ) { var orderToFacility = new FmsWorkOrderToFacility { SiteId = schedule.SiteId , OrderId = wo.OrderId , FacilityCode = f.FacilityCode , ProgressId = WORK_STANDBY }; list.Add( orderToFacility ); Trace.WriteLine( orderToFacility.SiteId + ", " + orderToFacility.OrderId + ", " + orderToFacility.FacilityCode ); // db.FmsWorkOrderToFacility.Add( orderToFacility ); } qm.DeleteAndInsert( db.FmsWorkOrderToFacility , list , facilityQueryToDelete ); } } transaction.Complete(); } } catch ( Exception e ) { Trace.WriteLine( e.Message ); throw; } */ return StatusCode( HttpStatusCode.NoContent ); } protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } } public class SeniorForOrder { public int SiteId { get; set; } public int SeniorId { get; set; } public string SeniorUserName { get; set; } public string SeniorItemName { get; set; } } public class FacilityScheduleForOrder { public int SiteId { get; set;} public int ScheduleId { get; set;} public Nullable BusinessFieldId { get; set;} public string ScheduleName { get; set;} public Nullable CheckGroupId { get; set; } public Nullable WorkTypeId { get; set; } public string UserId { get; set;} public string UserName { get; set;} public Nullable SeniorId { get; set;} public string WorkerName { get; set; } } public class CheckScheduleToGenerate { public int SiteId { get; set; } public int ScheduleId { get; set; } }; }