WorkRequestRepository.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IdentityModel.Tokens.Jwt;
  4. using System.Linq;
  5. using System.Security.Claims;
  6. using System.Text;
  7. using FMSAdmin.Data;
  8. using FMSAdmin.Helpers;
  9. using FMSAdmin.Entities;
  10. using Microsoft.EntityFrameworkCore;
  11. using Microsoft.Extensions.Logging;
  12. using Microsoft.Extensions.Options;
  13. using Microsoft.IdentityModel.Tokens;
  14. using FMSAdmin.Models;
  15. using System.Transactions;
  16. namespace FMSApp.Repositories {
  17. public class WorkRequestRepository {
  18. private readonly ILogger<WorkRequestRepository> _logger;
  19. private readonly FMSContext _context;
  20. private readonly AppSettings _appSettings;
  21. private readonly StorageHelper _storage;
  22. private readonly WorkConfigRepository _workConfigRepository;
  23. private readonly HolidayRepository _holidayRepository;
  24. public WorkRequestRepository(
  25. ILogger<WorkRequestRepository> logger,
  26. FMSContext context,
  27. IOptions<AppSettings> appSettings,
  28. StorageHelper storage,
  29. WorkConfigRepository workConfigRepository,
  30. HolidayRepository holidayRepository
  31. ) {
  32. _logger = logger;
  33. _context = context;
  34. _appSettings = appSettings.Value;
  35. _storage = storage;
  36. _workConfigRepository = workConfigRepository;
  37. _holidayRepository = holidayRepository;
  38. }
  39. public void CreateFromWorkSchedules() {
  40. var today = DateTime.Now.Date;
  41. var seekStartDate = today.AddDays(-31);
  42. using (var trans = new TransactionScope()) {
  43. var query = from schedule in _context.FmsWorkSchedule
  44. where schedule.IsUse == true
  45. && schedule.WorkDueDate >= seekStartDate
  46. && _context.FmsWorkRequest.Where(
  47. request => request.SiteId == schedule.SiteId
  48. && request.WorkScheduleId == schedule.WorkScheduleId
  49. && request.StartWorkDate == schedule.WorkDueDate
  50. ).Any() == false
  51. select schedule;
  52. foreach (var schedule in query) {
  53. CreateFromWorkSchedule(schedule);
  54. }
  55. trans.Complete();
  56. }
  57. }
  58. public bool IsCreatedRequest(FmsWorkSchedule schedule) {
  59. return _context.FmsWorkRequest.Any(
  60. x => x.SiteId == schedule.SiteId
  61. && x.WorkScheduleId == schedule.WorkScheduleId
  62. && x.StartWorkDate == schedule.WorkDueDate
  63. );
  64. }
  65. public void CreateAllRequestFromWorkSchedule(FmsWorkSchedule schedule, bool bTran = false) {
  66. var today = DateTime.Now.Date;
  67. TransactionScope trans = null;
  68. if (bTran) trans = new TransactionScope();
  69. try {
  70. if (schedule.WorkExpireDate == null) throw new ServiceException("작업만료일을 선택하세요.");
  71. DateTime startWorkDate = schedule.WorkDueDate;
  72. DateTime? endWorkDate = schedule.WorkEndDate;
  73. DateTime expireDate = schedule.WorkExpireDate.Value;
  74. var weekend = _holidayRepository.GetHolidayWeekend(schedule.SiteId);
  75. var holidays = _holidayRepository.GetHolidays(schedule.SiteId);
  76. var workrequestFileCategory = _context.CmFileCategory.First(x => x.Name == "workrequest");
  77. var workscheduleFileCategory = _context.CmFileCategory.First(x => x.Name == "workschedule");
  78. if (schedule.CmFile != null && schedule.CmFile.IsUpload) {
  79. _logger.LogError("<<<<<<<<<<<<<<<<<< schedule.CmFile IS NOT NULL >>>>>>>>>>>>>>>>");
  80. schedule.CmFile.SiteId = schedule.SiteId;
  81. schedule.CmFile.FileCategoryId = workscheduleFileCategory.FileCategoryId;
  82. schedule.CmFile.FileCategory = workscheduleFileCategory;
  83. schedule.CmFile.CreatedDate = DateTime.Now;
  84. } else {
  85. schedule.CmFile = null;
  86. }
  87. schedule.IsNotProcess = true;
  88. schedule.IsUse = true;
  89. _context.FmsWorkSchedule.Add(schedule);
  90. _context.SaveChanges();
  91. while (true) {
  92. var request = new FmsWorkRequest();
  93. request.CmFile = schedule.CmFile != null ? (new CmFile() {
  94. SiteId = schedule.CmFile.SiteId,
  95. FileCategoryId = workrequestFileCategory.FileCategoryId,
  96. FileCategory = workrequestFileCategory,
  97. Name = schedule.CmFile.Name,
  98. FileSize = schedule.CmFile.FileSize,
  99. CreatedDate = schedule.CmFile.CreatedDate,
  100. ContentType = schedule.CmFile.ContentType,
  101. IsUpload = schedule.CmFile.IsUpload,
  102. IsDelete = schedule.CmFile.IsDelete,
  103. Url = schedule.CmFile.Url,
  104. Path = schedule.CmFile.Path
  105. }) : null;
  106. request.FmsWorkSchedule = schedule;
  107. request.SiteId = schedule.SiteId;
  108. request.WorkTypeId = schedule.WorkTypeId;
  109. request.BusinessFieldId = schedule.BusinessFieldId;
  110. request.WorkProgressId = 1; // 작업계획
  111. request.Title = schedule.Name;
  112. request.Content = schedule.Content;
  113. request.RequestUserId = schedule.UpdateUserId;
  114. request.RequestDate = today;
  115. request.InspectionAgencyId = schedule.InspectionAgencyId;
  116. request.StartWorkDate = startWorkDate;
  117. request.WorkEndDate = endWorkDate;
  118. request.WorkPartnerId = schedule.WorkPartnerId;
  119. request.WorkPrice = schedule.WorkPrice;
  120. foreach (var facility in schedule.FmsWorkScheduleToFacility) {
  121. request.FmsWorkRequestToFacility.Add(new FmsWorkRequestToFacility() {
  122. SiteId = schedule.SiteId,
  123. FacilityCode = facility.FacilityCode
  124. });
  125. }
  126. _context.FmsWorkRequest.Add(request);
  127. _context.SaveChanges();
  128. // 자동지시 (일자가 도래해야 자동지시처리.)
  129. if (_workConfigRepository.IsAutoOrder(true) || schedule.IsAutoOrder) {
  130. if (request.StartWorkDate.Date <= today) {
  131. this.WorkToOrder(request.SiteId, request.WorkRequestId, request.RequestUserId, "");
  132. }
  133. }
  134. if (request.CmFile != null && request.CmFile.IsUpload) {
  135. _storage.CopyEntity(request.CmFile.Path, request.CmFile);
  136. }
  137. startWorkDate = this.GetNextDueDate(schedule, startWorkDate, weekend, holidays);
  138. if (!Util.IsNullOrEmpty(endWorkDate)) endWorkDate = this.GetNextDueDate(schedule, endWorkDate.Value, weekend, holidays);
  139. if (startWorkDate > expireDate) {
  140. break;
  141. }
  142. }
  143. if (schedule.CmFile != null && schedule.CmFile.IsUpload) {
  144. _storage.CopyEntity(schedule.CmFile.Path, schedule.CmFile);
  145. }
  146. if (trans != null) trans.Complete();
  147. } finally {
  148. if (trans != null) trans.Dispose();
  149. }
  150. }
  151. public void CreateFromWorkSchedule(FmsWorkSchedule schedule, bool bTran = false) {
  152. if (schedule.IsNotProcess) return;
  153. var today = DateTime.Now.Date;
  154. TransactionScope trans = null;
  155. if (bTran) trans = new TransactionScope();
  156. try {
  157. var request = new FmsWorkRequest();
  158. request.SiteId = schedule.SiteId;
  159. request.WorkTypeId = schedule.WorkTypeId;
  160. request.BusinessFieldId = schedule.BusinessFieldId;
  161. request.WorkScheduleId = schedule.WorkScheduleId;
  162. request.WorkProgressId = 1; // 작업계획
  163. request.Title = schedule.Name;
  164. request.Content = schedule.Content;
  165. request.RequestUserId = schedule.UpdateUserId;
  166. request.RequestDate = today;
  167. request.InspectionAgencyId = schedule.InspectionAgencyId;
  168. request.StartWorkDate = schedule.WorkDueDate;
  169. request.WorkPartnerName = schedule.WorkPartnerName;
  170. request.WorkPrice = schedule.WorkPrice;
  171. //request.WorkItem = schedule.WorkItem;
  172. foreach (var facility in schedule.FmsWorkScheduleToFacility) {
  173. request.FmsWorkRequestToFacility.Add(new FmsWorkRequestToFacility() {
  174. SiteId = schedule.SiteId,
  175. FacilityCode = facility.FacilityCode
  176. });
  177. }
  178. _context.FmsWorkRequest.Add(request);
  179. _context.SaveChanges();
  180. // 자동지시 (일자가 도래해야 자동지시처리.)
  181. if (_workConfigRepository.IsAutoOrder(true) || schedule.IsAutoOrder) {
  182. if (request.StartWorkDate.Date <= today) {
  183. this.WorkToOrder(request.SiteId, request.WorkRequestId, request.RequestUserId, "");
  184. }
  185. }
  186. if (trans != null) trans.Complete();
  187. } finally {
  188. if (trans != null) trans.Dispose();
  189. }
  190. }
  191. public void UpdateFromWorkSchedule(FmsWorkSchedule schedule) {
  192. // 작업계획(1) : 수정한다.
  193. // 작업반려(2) : 수정하지 않는다.
  194. // 작업대기(3) : 수정한다.
  195. // 작업진행(4) : 수정한다.
  196. // 작업완료(5) : 수정시 오류메시지 표시한다.
  197. // 작업승인(6) : 수정하지 않는다.
  198. // (승인시 차기작업이 생성되었을것이므로, 생성된 작업계획~작업진행 상태의 데이터에 대한 수정이 가해질 것임)
  199. // (차기작업을 생성하지 않았을경우 수정할 데이터가 없다.)
  200. // 작업보류(7) : 수정한다.
  201. var request = _context.FmsWorkRequest.Where(
  202. x => x.SiteId == schedule.SiteId
  203. && x.WorkScheduleId == schedule.WorkScheduleId
  204. && (new int[] { 1, 3, 4, 7 }).Contains(x.WorkProgressId)
  205. ).OrderByDescending(x => x.WorkRequestId).FirstOrDefault();
  206. if (request == null) {
  207. var completeCount = _context.FmsWorkRequest.Where(
  208. x => x.SiteId == schedule.SiteId
  209. && x.WorkScheduleId == schedule.WorkScheduleId
  210. && x.WorkProgressId == 5
  211. ).Count();
  212. if (completeCount > 0) {
  213. throw new ServiceException("작업완료처리된 작업은 계획수정이 불가능합니다. 작업승인 이후에 계획 수정이 가능합니다.");
  214. } else {
  215. // 계획, 대기, 진행, 완료, 보류 건이 없는상태
  216. // 작업이력관리에서 해당 계획의 작업이 삭제된 경우이다.
  217. // 이 경우 기존 계획으로 새로 생성해야한다.
  218. CreateFromWorkSchedule(schedule);
  219. }
  220. return;
  221. }
  222. // Request 정보 수정
  223. request.Title = schedule.Name;
  224. request.StartWorkDate = schedule.WorkDueDate.Date;
  225. request.InspectionAgencyId = schedule.InspectionAgencyId;
  226. request.Content = schedule.Content;
  227. //request.RequestUserId = schedule.UpdateUserId;
  228. //request.RequestDate = today;
  229. _context.FmsWorkRequest.Update(request);
  230. _context.SaveChanges();
  231. request.FmsWorkRequestToFacility.Clear();
  232. _context.SaveChanges();
  233. foreach (var facility in schedule.FmsWorkScheduleToFacility) {
  234. _context.FmsWorkRequestToFacility.Add(new FmsWorkRequestToFacility() {
  235. SiteId = facility.SiteId,
  236. WorkRequestId = request.WorkRequestId,
  237. FacilityCode = facility.FacilityCode
  238. });
  239. }
  240. _context.SaveChanges();
  241. // Order 정보 수정
  242. var order = request.FmsWorkOrder;
  243. if (order != null) {
  244. order.Title = request.Title;
  245. order.StartWorkDate = request.StartWorkDate;
  246. order.Content = request.Content;
  247. _context.FmsWorkOrder.Update(order);
  248. _context.SaveChanges();
  249. order.FmsWorkOrderToFacility.Clear();
  250. _context.SaveChanges();
  251. foreach (var facility in schedule.FmsWorkScheduleToFacility) {
  252. _context.FmsWorkOrderToFacility.Add(new FmsWorkOrderToFacility() {
  253. SiteId = facility.SiteId,
  254. WorkRequestId = request.WorkRequestId,
  255. FacilityCode = facility.FacilityCode
  256. });
  257. }
  258. _context.SaveChanges();
  259. }
  260. // Result 정보 수정
  261. var result = request.FmsWorkResult;
  262. if (result != null) {
  263. result.StartDate = request.StartWorkDate;
  264. result.EndDate = request.StartWorkDate;
  265. result.Content = request.Content;
  266. _context.FmsWorkOrder.Update(order);
  267. _context.SaveChanges();
  268. result.FmsWorkResultToFacility.Clear();
  269. _context.SaveChanges();
  270. foreach (var facility in schedule.FmsWorkScheduleToFacility) {
  271. _context.FmsWorkResultToFacility.Add(new FmsWorkResultToFacility() {
  272. SiteId = facility.SiteId,
  273. WorkRequestId = request.WorkRequestId,
  274. FacilityCode = facility.FacilityCode
  275. });
  276. }
  277. _context.SaveChanges();
  278. }
  279. }
  280. // 자동지시
  281. public void WorkToOrders() {
  282. _logger.LogInformation($"=============================================================================================");
  283. _logger.LogInformation($"작업시작일이 지나거나 당일인 실행계획 데이터를 작업지시 처리 (처리일 : {DateTime.Now})");
  284. int processCount = 0;
  285. if (_workConfigRepository.IsAutoOrder(true)) {
  286. _logger.LogInformation($"자동지시 전역설정 TRUE");
  287. // 전역설정이 자동지시로 되어있을때는 모든 실행계획 자동지시(정기,법정,교육,수시,공사)
  288. var query = from request in _context.FmsWorkRequest
  289. where request.StartWorkDate < DateTime.Now.AddDays(1).Date
  290. && request.WorkProgressId == 1
  291. && _context.FmsWorkOrder.Where(x => x.SiteId == request.SiteId
  292. && x.WorkRequestId == request.WorkRequestId
  293. && x.Title == request.Title).Any() == false
  294. select request;
  295. foreach (var request in query.ToList()) {
  296. WorkToOrder(request.SiteId, request.WorkRequestId, request.RequestUserId, "", true);
  297. processCount++;
  298. }
  299. } else {
  300. _logger.LogInformation($"자동지시 전역설정 FALSE");
  301. // 전역설정이 자동지시로 되어있지 않을때는 정기점검,법정검사,법정교육 (FmsWorkSchedule 등록되어있는 실행계획) 만 자동지시
  302. // 기초계획에 자동지시여부가 true 인것만 자동지시
  303. var query = from schedule in _context.FmsWorkSchedule
  304. join request in _context.FmsWorkRequest on schedule.WorkScheduleId equals request.WorkScheduleId
  305. where schedule.IsUse == true
  306. && request.WorkProgressId == 1
  307. && schedule.IsAutoOrder == true
  308. && (request.StartWorkDate < DateTime.Now.AddDays(1).Date)
  309. && _context.FmsWorkOrder.Where(x => x.SiteId == request.SiteId
  310. && x.WorkRequestId == request.WorkRequestId
  311. && x.Title == request.Title).Any() == false
  312. select request;
  313. foreach (var request in query.ToList()) {
  314. WorkToOrder(request.SiteId, request.WorkRequestId, request.RequestUserId, "", true);
  315. processCount++;
  316. }
  317. }
  318. _logger.LogInformation($"처리완료 : {processCount}건");
  319. _logger.LogInformation($"=============================================================================================");
  320. }
  321. // 자동수행
  322. public void WorkToResults() {
  323. _logger.LogInformation($"=============================================================================================");
  324. _logger.LogInformation($"작업수행 처리되지 않은 작업대기 목록 자동수행 (처리일시 : {DateTime.Now})");
  325. int processCount = 0;
  326. if (_workConfigRepository.IsAutoResult(true)) {
  327. _logger.LogInformation($"자동수행 전역설정 TRUE");
  328. var query = from order in _context.FmsWorkOrder
  329. join request in _context.FmsWorkRequest on order.WorkRequestId equals request.WorkRequestId
  330. where request.WorkProgressId == 3
  331. && _context.FmsWorkResult.Where(x => x.SiteId == order.SiteId
  332. && x.WorkRequestId == order.WorkRequestId).Any() == false
  333. select order;
  334. foreach (var order in query.ToList()) {
  335. WorkToResult(order, new FmsWorkResult {
  336. StartDate = order.StartWorkDate.Date,
  337. EndDate = order.StartWorkDate.Date,
  338. Content = "",
  339. WorkerUserId = order.OrderUserId,
  340. }, true);
  341. processCount++;
  342. }
  343. } else {
  344. _logger.LogInformation($"자동수행 전역설정 FALSE => 자동수행 안함.");
  345. }
  346. _logger.LogInformation($"처리완료 : {processCount}건");
  347. _logger.LogInformation($"=============================================================================================");
  348. }
  349. public void WorkToOrder(int siteId, int workRequestId, string orderUserId, string orderContent, bool bTran = false) {
  350. TransactionScope trans = null;
  351. if (bTran) trans = new TransactionScope();
  352. try {
  353. var persist = _context.FmsWorkRequest.FirstOrDefault(
  354. x => x.SiteId == siteId
  355. && x.WorkRequestId == workRequestId
  356. );
  357. if (persist == null) throw new ServiceException("존재하지 않는 데이터 입니다.");
  358. if (persist.WorkProgressId == 2) {
  359. throw new ServiceException("반려된 작업은 작업지시 처리할 수 없습니다.");
  360. }
  361. if (persist.WorkProgressId != 1) {
  362. throw new ServiceException("이미 작업지시 처리된 데이터입니다.");
  363. }
  364. // WorkRequest.WorkProgressId = 3
  365. persist.WorkProgressId = 3;
  366. _context.FmsWorkRequest.Update(persist);
  367. _context.SaveChanges();
  368. // WorkOrder 생성
  369. var order = new FmsWorkOrder();
  370. order.SiteId = persist.SiteId;
  371. order.WorkRequestId = persist.WorkRequestId;
  372. order.BusinessFieldId = persist.BusinessFieldId;
  373. order.Title = persist.Title;
  374. order.StartWorkDate = persist.StartWorkDate;
  375. order.OrderUserId = orderUserId;
  376. order.OrderDate = DateTime.Now;
  377. order.Content = orderContent;
  378. _context.FmsWorkOrder.Add(order);
  379. _context.SaveChanges();
  380. // 기존 WorkOrderToFacility 삭제
  381. var facilities = _context.FmsWorkOrderToFacility.Where(
  382. x => x.SiteId == persist.SiteId
  383. && x.WorkRequestId == persist.WorkRequestId
  384. );
  385. _context.FmsWorkOrderToFacility.RemoveRange(facilities);
  386. _context.SaveChanges();
  387. // 신규 WorkOrderToFacility 생성 From FmsWorkRequestToFacility
  388. foreach (var facility in persist.FmsWorkRequestToFacility.ToList()) {
  389. _context.FmsWorkOrderToFacility.Add(new FmsWorkOrderToFacility() {
  390. SiteId = facility.SiteId,
  391. WorkRequestId = facility.WorkRequestId,
  392. FacilityCode = facility.FacilityCode,
  393. });
  394. }
  395. _context.SaveChanges();
  396. // 자동진행
  397. if (_workConfigRepository.IsAutoResult(true)) {
  398. this.WorkToResult(order, new FmsWorkResult() {
  399. StartDate = order.StartWorkDate.Date,
  400. EndDate = order.StartWorkDate.Date,
  401. Content = "",
  402. WorkerUserId = order.OrderUserId,
  403. });
  404. }
  405. if (trans != null) trans.Complete();
  406. } catch (Exception ex) {
  407. _logger.LogError(ex, "");
  408. throw ex;
  409. } finally {
  410. if (trans != null) trans.Dispose();
  411. }
  412. }
  413. public void WorkToResult(FmsWorkOrder order, FmsWorkResult data, bool bTran = false) {
  414. TransactionScope trans = null;
  415. if (bTran) trans = new TransactionScope();
  416. try {
  417. if (order.FmsWorkRequest.WorkProgressId != 3) {
  418. throw new ServiceException("작업 대기상태의 데이터만 작업진행 가능합니다.");
  419. }
  420. // WorkRequest 의 ProgressId 변경
  421. order.FmsWorkRequest.WorkProgressId = 4;
  422. _context.FmsWorkRequest.Update(order.FmsWorkRequest);
  423. _context.SaveChanges();
  424. // WorkOrder 의 StartWorkDate 변경
  425. order.StartWorkDate = data.StartDate.Date;
  426. _context.FmsWorkOrder.Update(order);
  427. _context.SaveChanges();
  428. // WorkResult 생성
  429. var result = new FmsWorkResult() {
  430. SiteId = order.SiteId,
  431. WorkRequestId = order.WorkRequestId,
  432. StartDate = data.StartDate.Date,
  433. EndDate = data.EndDate.Date,
  434. Content = data.Content,
  435. IsConfirmed = false,
  436. WorkerUserId = data.WorkerUserId,
  437. };
  438. _context.FmsWorkResult.Add(result);
  439. _context.SaveChanges();
  440. // 기존 FmsWorkResultToFacility 삭제
  441. var facilities = _context.FmsWorkResultToFacility.Where(
  442. x => x.SiteId == order.SiteId
  443. && x.WorkRequestId == order.WorkRequestId
  444. );
  445. _context.FmsWorkResultToFacility.RemoveRange(facilities);
  446. _context.SaveChanges();
  447. // 신규 FmsWorkResultToFacility 생성 From FmsWorkOrderToFacility
  448. foreach (var facility in order.FmsWorkOrderToFacility.ToList()) {
  449. _context.FmsWorkResultToFacility.Add(new FmsWorkResultToFacility() {
  450. SiteId = facility.SiteId,
  451. WorkRequestId = facility.WorkRequestId,
  452. FacilityCode = facility.FacilityCode,
  453. });
  454. }
  455. _context.SaveChanges();
  456. if (trans != null) trans.Complete();
  457. } catch (Exception ex) {
  458. _logger.LogError(ex, "");
  459. throw ex;
  460. } finally {
  461. if (trans != null) trans.Dispose();
  462. }
  463. }
  464. public void WorkToResult(int siteId, int workRequestId, FmsWorkResult data, bool bTran = false) {
  465. TransactionScope trans = null;
  466. if (bTran) trans = new TransactionScope();
  467. try {
  468. var persist = _context.FmsWorkOrder.FirstOrDefault(
  469. x => x.SiteId == siteId
  470. && x.WorkRequestId == workRequestId
  471. );
  472. if (persist == null) throw new ServiceException("존재하지 않는 데이터 입니다.");
  473. this.WorkToResult(persist, data);
  474. if (trans != null) trans.Complete();
  475. } finally {
  476. if (trans != null) trans.Dispose();
  477. }
  478. }
  479. public DateTime GetNextDueDate(FmsWorkSchedule schedule, DateTime date, CmHolidayWeekend weekend, IList<DateTime> holidays) {
  480. DateTime WorkDueDate = date;
  481. DateTime EndDate = date;
  482. switch (schedule.CycleUnitId) {
  483. case 1: WorkDueDate = EndDate.AddDays(schedule.CycleSize); break;
  484. case 2: WorkDueDate = EndDate.AddDays(schedule.CycleSize * 7); break;
  485. case 3: WorkDueDate = EndDate.AddMonths(schedule.CycleSize); break;
  486. case 4: WorkDueDate = EndDate.AddMonths(schedule.CycleSize * 3); break;
  487. case 5: WorkDueDate = EndDate.AddMonths(schedule.CycleSize * 6); break;
  488. case 6: WorkDueDate = EndDate.AddYears(schedule.CycleSize); break;
  489. }
  490. if (schedule.HolidayWorkTypeId == 0) return WorkDueDate;
  491. bool isHoliday = _holidayRepository.IsHoliday(WorkDueDate, weekend, holidays);
  492. if (schedule.HolidayWorkTypeId == 1) {
  493. while (!isHoliday) {
  494. WorkDueDate = WorkDueDate.AddDays(1);
  495. isHoliday = _holidayRepository.IsHoliday(WorkDueDate, weekend, holidays);
  496. }
  497. return WorkDueDate;
  498. }
  499. if (schedule.HolidayWorkTypeId == 2) {
  500. while (isHoliday) {
  501. WorkDueDate = WorkDueDate.AddDays(1);
  502. isHoliday = _holidayRepository.IsHoliday(WorkDueDate, weekend, holidays);
  503. }
  504. return WorkDueDate;
  505. }
  506. return WorkDueDate;
  507. }
  508. }
  509. }