123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.Data;
- using System.Data.Entity;
- using System.Data.Entity.Infrastructure;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Web;
- using System.Web.Http;
- using System.Web.Http.Description;
- using System.Web.Http.OData;
- using iBemsDataService;
- using iBemsDataService.Model;
- using iBemsDataService.Util;
- namespace iBemsDataService.Controllers
- {
- public class AvailableDueDateController : ApiController
- {
- private iBemsEntities db = new iBemsEntities();
- [ActionName("GetAvailableDueDate")]
- public List<AvailableDueDateType> GetAvailableDueDate()
- {
- List<AvailableDueDateType> dueDateList = new List<AvailableDueDateType>();
- Uri uri = Request.RequestUri;
- var uriQuery = HttpUtility.ParseQueryString(uri.Query);
- int siteId, workRequestId;
- if (int.TryParse(uriQuery.Get("SiteId"), out siteId) == false ||
- int.TryParse(uriQuery.Get("WorkRequestId"), out workRequestId) == false)
- {
- dueDateList.Add(new AvailableDueDateType() { DueDate = DateTime.Now });
- return dueDateList;
- }
- // WorkRequest 정보
- var workRequest = (
- from w in db.FmsWorkRequest
- where w.SiteId == siteId &&
- w.WorkRequestId == workRequestId
- select w).FirstOrDefault();
- if (workRequest == null || workRequest.WorkScheduleId == null)
- {
- dueDateList.Add(new AvailableDueDateType() { DueDate = DateTime.Now });
- return dueDateList;
- }
- // 스케줄 정보
- var workSchedule = (
- from s in db.FmsWorkSchedule
- where s.SiteId == siteId &&
- s.WorkScheduleId == workRequest.WorkScheduleId &&
- s.IsUse == true
- select s)
- .FirstOrDefault();
- if (workSchedule == null)
- {
- dueDateList.Add(new AvailableDueDateType() { DueDate = DateTime.Now });
- return dueDateList;
- }
- var workResult = (
- from s in db.FmsWorkResult
- where s.SiteId == siteId &&
- s.WorkRequestId == workRequestId
- select s)
- .FirstOrDefault();
- // 주기 간격
- int cycleSize = workSchedule.CycleSize;
- // 현재일자
- //DateTime currentDueDate = DateTime.Now;
- // 종료일자
- DateTime EndDueDate = workResult.EndDate;
- // 확정일자
- DateTime plannDueDate = new DateTime();
- // 주기 유형
- // CycleUnitId :: 1: 일간 / 2: 주간 / 3: 월간 / 4: 분기 / 5: 반기 / 6: 년간
- switch (workSchedule.CycleUnitId)
- {
- case 1:
- plannDueDate = EndDueDate.AddDays(cycleSize);
- break;
- case 2:
- plannDueDate = EndDueDate.AddDays(cycleSize * 7);
- break;
- case 3:
- plannDueDate = EndDueDate.AddMonths(cycleSize);
- break;
- case 4:
- plannDueDate = EndDueDate.AddMonths(cycleSize * 3);
- break;
- case 5:
- plannDueDate = EndDueDate.AddMonths(cycleSize * 6);
- break;
- case 6:
- plannDueDate = EndDueDate.AddYears(cycleSize);
- break;
- }
- // 휴일근무 사용안함 인 경우
- if (workSchedule.HolidayWorkTypeId == 0)
- {
- dueDateList.Add(new AvailableDueDateType() { DueDate = plannDueDate });
- return dueDateList;
- }
- // 휴일 리스트
- List<DateTime> holidayList = GetHolidayList(siteId);
- // 토요일, 일요일 휴무 여부
- bool isUseSaturdayHoliday = false;
- bool isUseSundayHoliday = false;
- var holidayWeekend = db.CmHolidayWeekend
- .Where(hw => hw.SiteId == siteId && hw.IsUse == true)
- .FirstOrDefault();
- if (holidayWeekend == null)
- {
- isUseSaturdayHoliday = true;
- isUseSundayHoliday = true;
- }
- else
- {
- isUseSaturdayHoliday = holidayWeekend.Saturday;
- isUseSundayHoliday = holidayWeekend.Sunday;
- }
- // 확정일자 계산
- bool isHoliday = CheckIsHoliday(plannDueDate, isUseSaturdayHoliday, isUseSundayHoliday, holidayList);
- // 휴일근무인 경우
- if (workSchedule.HolidayWorkTypeId == 1)
- {
- while (!isHoliday)
- {
- plannDueDate = plannDueDate.AddDays(1);
- isHoliday = CheckIsHoliday(plannDueDate, isUseSaturdayHoliday, isUseSundayHoliday, holidayList);
- }
- dueDateList.Add(new AvailableDueDateType() { DueDate = plannDueDate });
- return dueDateList;
- }
- // 익일근무인 경우
- if (workSchedule.HolidayWorkTypeId == 2)
- {
- while (isHoliday)
- {
- plannDueDate = plannDueDate.AddDays(1);
- isHoliday = CheckIsHoliday(plannDueDate, isUseSaturdayHoliday, isUseSundayHoliday, holidayList);
- }
- dueDateList.Add(new AvailableDueDateType() { DueDate = plannDueDate });
- return dueDateList;
- }
- return dueDateList;
- }
- private bool CheckIsHoliday(DateTime plannDueDate, bool isUseSaturdayHoliday, bool isUseSundayHoliday, List<DateTime> holidayList)
- {
- // 토,일요일인 경우 리턴
- if (plannDueDate.DayOfWeek == DayOfWeek.Saturday && isUseSaturdayHoliday)
- {
- return true;
- }
- if (plannDueDate.DayOfWeek == DayOfWeek.Sunday && isUseSundayHoliday)
- {
- return true;
- }
- // 휴무일에 포함되어 있는 경우 리턴
- foreach (var item in holidayList)
- {
- if (item.Month == plannDueDate.Month && item.Day == plannDueDate.Day)
- {
- return true;
- }
- }
- return false;
- }
- private List<DateTime> GetHolidayList(int siteId)
- {
- List<DateTime> holidayList = new List<DateTime>();
- var cmHolidays = db.CmHoliday
- .Where(h => h.SiteId == siteId && h.IsUse == true)
- .ToList();
- int currentYear = DateTime.Now.Year;
- foreach (var item in cmHolidays)
- {
- if (item.IsLunar)
- {
- Solar sol = new Solar()
- {
- solarYear = currentYear,
- solarMonth = item.HolidayMonth,
- solarDay = item.HolidayDay
- };
- Lunar lun = LunarSolarConverter.SolarToLunar(sol);
- DateTime date = new DateTime(lun.lunarYear, lun.lunarMonth, lun.lunarDay);
- holidayList.Add(date);
- }
- else
- {
- DateTime date = new DateTime(currentYear, item.HolidayMonth, item.HolidayDay);
- holidayList.Add(date);
- }
- }
- // 커스텀 휴일 리스트
- var customHolidays = db.CmHolidayCustom
- .Where(ch => ch.SiteId == siteId
- && ch.HolidayDate >= DateTime.Now
- && ch.IsUse == true)
- .ToList();
- foreach (var item in customHolidays)
- {
- holidayList.Add(item.HolidayDate);
- }
- return holidayList;
- }
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- db.Dispose();
- }
- base.Dispose(disposing);
- }
- }
- public class AvailableDueDateType
- {
- public DateTime DueDate { get; set; }
- }
- }
|