WorkScheduleService.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  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 FMSApp.Repositories;
  16. using System.Transactions;
  17. namespace FMSApp.Services {
  18. public class WorkScheduleService {
  19. private readonly ILogger<WorkScheduleService> _logger;
  20. private readonly FMSContext _context;
  21. private readonly AppSettings _appSettings;
  22. private readonly StorageHelper _storage;
  23. private readonly WorkRequestRepository _workRequestRepository;
  24. private readonly WorkConfigRepository _workConfigRepository;
  25. public WorkScheduleService(
  26. ILogger<WorkScheduleService> logger,
  27. FMSContext context,
  28. IOptions<AppSettings> appSettings,
  29. StorageHelper storage,
  30. WorkRequestRepository workRequestRepository,
  31. WorkConfigRepository workConfigRepository
  32. ) {
  33. _logger = logger;
  34. _context = context;
  35. _appSettings = appSettings.Value;
  36. _storage = storage;
  37. _workRequestRepository = workRequestRepository;
  38. _workConfigRepository = workConfigRepository;
  39. }
  40. // 작업스케쥴 저장 (정기점검, 법정검사, 법정교육 저장)
  41. public void Save(FmsWorkSchedule data) {
  42. FmsWorkSchedule schedule = null;
  43. using (var trans = new TransactionScope()) {
  44. var persist = _context.FmsWorkSchedule
  45. .Where(x => x.SiteId == data.SiteId
  46. && x.WorkScheduleId == data.WorkScheduleId).FirstOrDefault();
  47. if (persist == null) {
  48. var check = _context.FmsWorkSchedule.Where(x => x.SiteId == data.SiteId
  49. && x.BusinessFieldId == data.BusinessFieldId
  50. && x.Name == data.Name).Count();
  51. if (check > 0) {
  52. throw new ServiceException("동일한 작업계획이 이미 등록되어있습니다.(등록)");
  53. }
  54. // 법정교육일때 설비목록 제거
  55. if (data.WorkTypeId == 7) {
  56. data.FmsWorkScheduleToFacility = new List<FmsWorkScheduleToFacility>();
  57. }
  58. // 설비 기본정보 생성되지 않도록 처리
  59. foreach (var facility in data.FmsWorkScheduleToFacility) {
  60. facility.CmFacility = null;
  61. }
  62. _context.FmsWorkSchedule.Add(data);
  63. _context.SaveChanges();
  64. schedule = data;
  65. // 등록시에는 Request 자동 생성
  66. _workRequestRepository.CreateFromWorkSchedule(schedule);
  67. } else {
  68. var check = _context.FmsWorkSchedule.Where(x => x.SiteId == data.SiteId
  69. && x.WorkScheduleId != data.WorkScheduleId
  70. && x.BusinessFieldId == data.BusinessFieldId
  71. && x.Name == data.Name).Count();
  72. if (check > 0) {
  73. throw new ServiceException("동일한 작업계획이 이미 등록되어있습니다.(수정)");
  74. }
  75. // 입력 데이터 반영
  76. persist.BusinessFieldId = data.BusinessFieldId;
  77. persist.Name = data.Name;
  78. persist.InspectionAgencyId = data.InspectionAgencyId;
  79. persist.CycleSize = data.CycleSize;
  80. persist.CycleUnitId = data.CycleUnitId;
  81. persist.HolidayWorkTypeId = data.HolidayWorkTypeId;
  82. persist.WorkDueDate = data.WorkDueDate.Date;
  83. persist.UpdateUserId = data.UpdateUserId;
  84. persist.IsUse = data.IsUse;
  85. persist.IsAutoOrder = data.IsAutoOrder;
  86. persist.Content = data.Content;
  87. // 법정교육일때 설비목록 제거
  88. if (data.WorkTypeId == 7) {
  89. data.FmsWorkScheduleToFacility = new List<FmsWorkScheduleToFacility>();
  90. }
  91. //등록된 설비 전체 삭제
  92. persist.FmsWorkScheduleToFacility.Clear();
  93. // 추가된 설비 생성
  94. foreach (var facility in data.FmsWorkScheduleToFacility) {
  95. persist.FmsWorkScheduleToFacility.Add(new FmsWorkScheduleToFacility() {
  96. SiteId = persist.SiteId,
  97. WorkScheduleId = persist.WorkScheduleId,
  98. FacilityCode = facility.FacilityCode,
  99. });
  100. }
  101. _context.FmsWorkSchedule.Update(persist);
  102. _context.SaveChanges();
  103. schedule = persist;
  104. // 수정시에는 해당 Schedule 을 물고있는 Request 중
  105. // 작업완료 이전단계(1:작업계획, 3:작업대기, 4:작업진행, 7:작업보류)의 Request, Order, Result 의 정보를 Update 한다.
  106. _workRequestRepository.UpdateFromWorkSchedule(schedule);
  107. }
  108. trans.Complete();
  109. }
  110. }
  111. public void SaveExpectedRequest(FmsWorkSchedule data) {
  112. FmsWorkSchedule schedule = null;
  113. using (var trans = new TransactionScope()) {
  114. var persist = _context.FmsWorkSchedule
  115. .Where(x => x.SiteId == data.SiteId
  116. && x.WorkScheduleId == data.WorkScheduleId).FirstOrDefault();
  117. if (persist == null) {
  118. var check = _context.FmsWorkSchedule.Where(x => x.SiteId == data.SiteId
  119. && x.BusinessFieldId == data.BusinessFieldId
  120. && x.Name == data.Name
  121. && x.WorkDueDate.Date <= data.WorkDueDate.Date && x.WorkExpireDate >= data.WorkDueDate.Date
  122. ).Count();
  123. if (check > 0) {
  124. throw new ServiceException("동일한 작업계획이 이미 등록되어있습니다.(등록)");
  125. }
  126. // 법정교육일때 설비목록 제거
  127. if (data.WorkTypeId == 7) {
  128. data.FmsWorkScheduleToFacility = new List<FmsWorkScheduleToFacility>();
  129. }
  130. // 설비 기본정보 생성되지 않도록 처리
  131. foreach (var facility in data.FmsWorkScheduleToFacility) {
  132. facility.CmFacility = null;
  133. }
  134. schedule = data;
  135. // 등록시에는 Request 자동 생성
  136. _workRequestRepository.CreateAllRequestFromWorkSchedule(schedule);
  137. }
  138. trans.Complete();
  139. }
  140. }
  141. public void DeleteWithResult(int siteId, int workRequestId) {
  142. var request = _context.FmsWorkRequest.First(x => x.SiteId == siteId && x.WorkRequestId == workRequestId);
  143. var order = request.FmsWorkOrder;
  144. var result = request.FmsWorkResult;
  145. var schedule = request.FmsWorkSchedule;
  146. if (result != null && result.FmsWorkResultCheckItem.Count > 0) {
  147. throw new ServiceException("진행중인작업은 삭제할수 없습니다.");
  148. }
  149. if (result != null) {
  150. foreach (var facility in result.FmsWorkResultToFacility.ToList()) {
  151. _context.FmsWorkResultToFacility.Remove(facility);
  152. }
  153. _context.FmsWorkResult.Remove(result);
  154. _context.SaveChanges();
  155. }
  156. if (order != null) {
  157. foreach (var facility in order.FmsWorkOrderToFacility.ToList()) {
  158. _context.FmsWorkOrderToFacility.Remove(facility);
  159. }
  160. _context.FmsWorkOrder.Remove(order);
  161. _context.SaveChanges();
  162. }
  163. if (request != null) {
  164. foreach (var facility in request.FmsWorkRequestToFacility.ToList()) {
  165. _context.FmsWorkRequestToFacility.Remove(facility);
  166. }
  167. foreach (var accident in request.FmsWorkRequestToAccident.ToList()) {
  168. _context.FmsWorkRequestToAccident.Remove(accident);
  169. }
  170. foreach (var complaint in request.FmsWorkRequestToComplaint.ToList()) {
  171. _context.FmsWorkRequestToComplaint.Remove(complaint);
  172. }
  173. _context.FmsWorkRequest.Remove(request);
  174. _context.SaveChanges();
  175. }
  176. if (schedule != null && schedule.IsNotProcess) {
  177. // 처리되지 않는 작업계획(참고용) 의 경우 모든 Request 가 삭제된 경우 같이 삭제함.
  178. var requestCount = _context.FmsWorkRequest.Count(x => x.SiteId == schedule.SiteId && x.WorkScheduleId == schedule.WorkScheduleId);
  179. if (requestCount <= 0) {
  180. foreach (var facility in schedule.FmsWorkScheduleToFacility.ToList()) {
  181. _context.FmsWorkScheduleToFacility.Remove(facility);
  182. }
  183. _context.FmsWorkSchedule.Remove(schedule);
  184. _context.SaveChanges();
  185. }
  186. }
  187. }
  188. public void Delete(int siteId, int workScheduleId) {
  189. var data = _context.FmsWorkSchedule.First(x => x.SiteId == siteId && x.WorkScheduleId == workScheduleId);
  190. _context.FmsWorkSchedule.Remove(data);
  191. _context.SaveChanges();
  192. }
  193. public string GetUpdateScheduleWarningMessage(int siteId, int workScheduleId) {
  194. // 작업계획(1) : 메세지 표시.(IsAutoOrder, IsAutoResult 아닐때만)
  195. // 작업대기(3) : 메세지 표시.(IsAutoOrder, IsAutoResult 아닐때만)
  196. // 작업진행(4) : 메세지 표시.
  197. var schedule = _context.FmsWorkSchedule.Where(
  198. x => x.SiteId == siteId
  199. && x.WorkScheduleId == workScheduleId
  200. ).FirstOrDefault();
  201. if (schedule == null) return null;
  202. var request = _context.FmsWorkRequest.Where(
  203. x => x.SiteId == schedule.SiteId
  204. && x.WorkScheduleId == schedule.WorkScheduleId
  205. && (new int[] { 1, 3, 4 }).Contains(x.WorkProgressId)
  206. ).OrderByDescending(x => x.WorkRequestId).FirstOrDefault();
  207. if (request == null) return null;
  208. string warningMessage = "해당 계획수정시 진행중인 작업의 내용이 같이 변경됩니다. 변경하시겠습니까?";
  209. if (request.WorkProgressId == 1 || request.WorkProgressId == 3) {
  210. if (!_workConfigRepository.IsAutoOrder() || !_workConfigRepository.IsAutoResult()) {
  211. return warningMessage;
  212. }
  213. } else {
  214. return warningMessage;
  215. }
  216. return null;
  217. }
  218. public IQueryable<FmsWorkSchedule> GetAll() {
  219. var query = _context.FmsWorkSchedule;
  220. return query;
  221. }
  222. }
  223. }