WorkResultService.cs 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872
  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. using FMSApp.Repositories;
  17. using System.Dynamic;
  18. namespace FMSApp.Services {
  19. public class WorkResultService {
  20. private readonly ILogger<WorkResultService> _logger;
  21. private readonly FMSContext _context;
  22. private readonly AppSettings _appSettings;
  23. private readonly StorageHelper _storage;
  24. private readonly WorkRequestRepository _workRequestRepository;
  25. private readonly HolidayRepository _holidayRepository;
  26. public WorkResultService(
  27. ILogger<WorkResultService> logger,
  28. FMSContext context,
  29. IOptions<AppSettings> appSettings,
  30. StorageHelper storage,
  31. WorkRequestRepository workRequestRepository,
  32. HolidayRepository holidayRepository
  33. ) {
  34. _logger = logger;
  35. _context = context;
  36. _appSettings = appSettings.Value;
  37. _storage = storage;
  38. _workRequestRepository = workRequestRepository;
  39. _holidayRepository = holidayRepository;
  40. }
  41. // 저장 (사용안함, 작업진행관리의 작업지시내용은 변경 불가능)
  42. // PC_작업대기 화면 미사용시 시작일과 종료일이 동일하게 들어가기때문에 종료일을 수정하여야 한다.
  43. public void Save(FmsWorkResult data) {
  44. using (var trans = new TransactionScope()) {
  45. var persist = _context.FmsWorkResult.FirstOrDefault(
  46. x => x.SiteId == data.SiteId
  47. && x.WorkRequestId == data.WorkRequestId
  48. );
  49. if (persist == null) throw new ServiceException("존재하지 않는 데이터 입니다.");
  50. persist.EndDate = data.EndDate;
  51. _context.FmsWorkResult.Update(persist);
  52. _context.SaveChanges();
  53. trans.Complete();
  54. }
  55. }
  56. // 작업이력 저장
  57. // 작업이력 저장시 완료/보류 선택여부에 따라 완료 혹은 보류 처리됨.
  58. public void SaveCheckItem(FmsWorkResultCheckItem data, string userId) {
  59. using (var trans = new TransactionScope()) {
  60. var persist = _context.FmsWorkResultCheckItem.FirstOrDefault(
  61. x => x.SiteId == data.SiteId
  62. && x.WorkRequestId == data.WorkRequestId
  63. && x.CheckItemId == data.CheckItemId
  64. );
  65. if (persist == null) {
  66. // create
  67. // 파일 카테고리 및 등록일 설정
  68. if (data.CmFile1 != null && data.CmFile1.IsUpload) {
  69. data.CmFile1.SiteId = data.SiteId;
  70. var category = _context.CmFileCategory.First(x => x.Name == "work");
  71. data.CmFile1.FileCategory = category;
  72. data.CmFile1.CreatedDate = DateTime.Now;
  73. } else {
  74. data.CmFile1 = null;
  75. }
  76. if (data.CmFile2 != null && data.CmFile2.IsUpload) {
  77. data.CmFile2.SiteId = data.SiteId;
  78. var category = _context.CmFileCategory.First(x => x.Name == "work");
  79. data.CmFile2.FileCategory = category;
  80. data.CmFile2.CreatedDate = DateTime.Now;
  81. } else {
  82. data.CmFile2 = null;
  83. }
  84. // 자재 기본정보 생성되지 않도록 처리
  85. foreach (var material in data.FmsWorkResultCheckItemMaterial) {
  86. material.FmsMaterial = null;
  87. material.FmsWorkResult = null;
  88. }
  89. _context.FmsWorkResultCheckItem.Add(data);
  90. _context.SaveChanges();
  91. // 파일 저장
  92. if (data.CmFile1 != null && data.CmFile1.IsUpload) {
  93. _storage.CopyEntity(data.CmFile1.Path, data.CmFile1);
  94. }
  95. if (data.CmFile2 != null && data.CmFile2.IsUpload) {
  96. _storage.CopyEntity(data.CmFile2.Path, data.CmFile2);
  97. }
  98. // 출고
  99. persist = _context.FmsWorkResultCheckItem.FirstOrDefault(
  100. x => x.SiteId == data.SiteId
  101. && x.WorkRequestId == data.WorkRequestId
  102. && x.CheckItemId == data.CheckItemId
  103. );
  104. var request = _context.FmsWorkRequest.FirstOrDefault(
  105. x => x.SiteId == data.SiteId
  106. && x.WorkRequestId == data.WorkRequestId
  107. );
  108. foreach (var material in persist.FmsWorkResultCheckItemMaterial) {
  109. MaterialRelease(material, request, userId);
  110. }
  111. } else {
  112. // update
  113. // 파일 삭제 / 생성
  114. if (data.CmFile1 != null && data.CmFile1.IsUpload) {
  115. var category = _context.CmFileCategory.First(x => x.Name == "work");
  116. persist.CmFile1 = new CmFile {
  117. SiteId = data.SiteId,
  118. FileCategory = category,
  119. CreatedDate = DateTime.Now,
  120. Name = data.CmFile1.Name,
  121. FileSize = data.CmFile1.FileSize,
  122. ContentType = data.CmFile1.ContentType,
  123. };
  124. _logger.LogInformation("upload file1");
  125. } else if (data.CmFile1 != null && data.CmFile1.IsDelete) {
  126. persist.FileId1 = null;
  127. persist.CmFile1 = null;
  128. _logger.LogInformation("delete file1");
  129. }
  130. if (data.CmFile2 != null && data.CmFile2.IsUpload) {
  131. var category = _context.CmFileCategory.First(x => x.Name == "work");
  132. persist.CmFile2 = new CmFile {
  133. SiteId = data.SiteId,
  134. FileCategory = category,
  135. CreatedDate = DateTime.Now,
  136. Name = data.CmFile2.Name,
  137. FileSize = data.CmFile2.FileSize,
  138. ContentType = data.CmFile2.ContentType,
  139. };
  140. _logger.LogInformation("upload file1");
  141. } else if (data.CmFile2 != null && data.CmFile2.IsDelete) {
  142. persist.FileId2 = null;
  143. persist.CmFile2 = null;
  144. _logger.LogInformation("delete file2");
  145. }
  146. persist.CheckDate = data.CheckDate;
  147. persist.TextResult = data.TextResult;
  148. _context.FmsWorkResultCheckItem.Update(persist);
  149. _context.SaveChanges();
  150. // 등록된 전체 자재 목록 삭제
  151. foreach (var material in persist.FmsWorkResultCheckItemMaterial.ToList()) {
  152. RemoveMaterialRelease(material);
  153. _context.FmsWorkResultCheckItemMaterial.Remove(material);
  154. }
  155. persist.FmsWorkResultCheckItemMaterial.Clear();
  156. _context.FmsWorkResultCheckItem.Update(persist);
  157. _context.SaveChanges();
  158. // 삭제된 아이템 제외하고 신규저장
  159. foreach (var material in data.FmsWorkResultCheckItemMaterial) {
  160. var createdItem = _context.FmsWorkResultCheckItemMaterial.Add(new FmsWorkResultCheckItemMaterial() {
  161. SiteId = persist.SiteId,
  162. WorkRequestId = persist.WorkRequestId,
  163. CheckItemId = persist.CheckItemId,
  164. MaterialId = material.MaterialId,
  165. MaterialCode = material.MaterialCode,
  166. MaterialCount = material.MaterialCount,
  167. Name = material.Name,
  168. });
  169. _context.SaveChanges();
  170. MaterialRelease(createdItem.Entity, persist.FmsWorkResult.FmsWorkRequest, userId);
  171. }
  172. // 파일 저장
  173. if (data.CmFile1 != null && data.CmFile1.IsUpload) {
  174. // 카피
  175. _storage.CopyEntity(data.CmFile1.Path, persist.CmFile1);
  176. if (persist.CmFile1 != null) {
  177. // 파일 삭제시 진짜 DB삭제?
  178. }
  179. }
  180. if (data.CmFile2 != null && data.CmFile2.IsUpload) {
  181. // 카피
  182. _storage.CopyEntity(data.CmFile2.Path, persist.CmFile2);
  183. if (persist.CmFile2 != null) {
  184. // 파일 삭제시 진짜 DB삭제?
  185. }
  186. }
  187. // 완료된작업의 이력 수정시 날짜가 작업의 종료일자보다 크면 종료일자 업데이트
  188. var result = persist.FmsWorkResult;
  189. var request = result?.FmsWorkRequest;
  190. if (result != null && request != null && request.WorkProgressId == 5) {
  191. if (result.EndDate.Date < data.CheckDate.Date) {
  192. result.EndDate = data.CheckDate.Date;
  193. _context.FmsWorkResult.Update(result);
  194. _context.SaveChanges();
  195. }
  196. }
  197. }
  198. //작업 이력 저장시 완료 및 보류 여부 제거에 따른 주석
  199. //this.Process(data.SiteId, data.WorkRequestId, data.IsComplete, data.IsHold, data.CheckDate);
  200. trans.Complete();
  201. }
  202. }
  203. // 완료 / 보류 처리
  204. // 작업이력 저장 시 사용됨.
  205. public void Process(int siteId, int workRequestId, bool isComplete, bool isHold, DateTime checkDate) {
  206. if (!isComplete && !isHold) return;
  207. var result = _context.FmsWorkResult.FirstOrDefault(
  208. x => x.SiteId == siteId
  209. && x.WorkRequestId == workRequestId
  210. );
  211. if (result == null) throw new ServiceException("존재하지 않는 데이터 입니다.");
  212. // 완료 / 보류 처리
  213. var request = result.FmsWorkRequest;
  214. if (request == null) throw new ServiceException("존재하지 않는 데이터 입니다.");
  215. if (request.WorkProgressId == 5 || request.WorkProgressId == 7) {
  216. return;
  217. }
  218. if (request.WorkProgressId != 4) {
  219. throw new ServiceException("진행상태의 작업이 아닙니다.");
  220. }
  221. if (isHold) {
  222. request.WorkProgressId = 7;
  223. } else if (isComplete) {
  224. request.WorkProgressId = 5;
  225. }
  226. _context.FmsWorkRequest.Update(request);
  227. _context.SaveChanges();
  228. // 완료시 EndDate Update
  229. if (request.WorkProgressId == 5) {
  230. result.EndDate = checkDate;
  231. _context.FmsWorkResult.Update(result);
  232. _context.SaveChanges();
  233. }
  234. }
  235. // 작업진행 (보류해제)
  236. public void Continue(FmsWorkResult data) {
  237. using (var trans = new TransactionScope()) {
  238. var persist = _context.FmsWorkResult.FirstOrDefault(
  239. x => x.SiteId == data.SiteId
  240. && x.WorkRequestId == data.WorkRequestId
  241. );
  242. if (persist == null) throw new Exception("존재하지 않는 데이터 입니다.");
  243. if (persist.FmsWorkRequest.WorkProgressId != 7) {
  244. throw new ServiceException("보류상태의 작업이 아닙니다.");
  245. }
  246. persist.FmsWorkRequest.WorkProgressId = 4;
  247. _context.FmsWorkRequest.Update(persist.FmsWorkRequest);
  248. _context.SaveChanges();
  249. trans.Complete();
  250. }
  251. }
  252. public void CompleteWithAdditionalData(FmsWorkResult data) {
  253. using (var trans = new TransactionScope()) {
  254. var request = _context.FmsWorkRequest.FirstOrDefault(
  255. x => x.SiteId == data.SiteId
  256. && x.WorkRequestId == data.WorkRequestId
  257. );
  258. if (request == null) throw new ServiceException("존재하지 않는 데이터 입니다.");
  259. var result = request.FmsWorkResult;
  260. if (result == null) throw new ServiceException("존재하지 않는 데이터 입니다.");
  261. var order = _context.FmsWorkOrder.FirstOrDefault(
  262. x => x.SiteId == data.SiteId
  263. && x.WorkRequestId == data.WorkRequestId
  264. );
  265. if (order == null) throw new Exception("존재하지 않는 데이터 입니다.");
  266. if (request.WorkProgressId != 4) {
  267. throw new ServiceException("진행상태의 작업이 아닙니다.");
  268. }
  269. // 추가정보 저장 (작업자, 업체)
  270. request.WorkUsers = data.FmsWorkRequest.WorkUsers;
  271. request.WorkPartnerId = data.FmsWorkRequest.WorkPartnerId;
  272. _context.FmsWorkRequest.Update(request);
  273. _context.SaveChanges();
  274. // 추가정보 저장 (시작일, 종료일)
  275. result.StartDate = data.StartDate;
  276. result.EndDate = data.EndDate;
  277. _context.FmsWorkResult.Update(result);
  278. _context.SaveChanges();
  279. // 등록된 이력의 CheckDate 중 가장 큰 일자가 Result.EndDate 보다 크면 Result.EndDate Update
  280. /*
  281. var checkItem = result.FmsWorkResultCheckItem.OrderByDescending(x => x.CheckDate).FirstOrDefault();
  282. if (checkItem != null) {
  283. if (checkItem.CheckDate.Date > result.EndDate.Date) {
  284. result.EndDate = checkItem.CheckDate.Date;
  285. _context.FmsWorkResult.Update(result);
  286. _context.SaveChanges();
  287. }
  288. } else {
  289. if (result.StartDate.Date < DateTime.Now.Date) {
  290. result.EndDate = DateTime.Now.Date;
  291. _context.FmsWorkResult.Update(result);
  292. _context.SaveChanges();
  293. }
  294. }
  295. */
  296. request.WorkProgressId = 5;
  297. _context.FmsWorkRequest.Update(request);
  298. _context.SaveChanges();
  299. trans.Complete();
  300. }
  301. }
  302. public void Complete(FmsWorkRequest data) {
  303. using (var trans = new TransactionScope()) {
  304. var request = _context.FmsWorkRequest.FirstOrDefault(
  305. x => x.SiteId == data.SiteId
  306. && x.WorkRequestId == data.WorkRequestId
  307. );
  308. if (request == null) throw new ServiceException("존재하지 않는 데이터 입니다.");
  309. if (request.WorkProgressId != 4) {
  310. throw new ServiceException("진행상태의 작업이 아닙니다.");
  311. }
  312. // 등록된 이력의 CheckDate 중 가장 큰 일자가 Result.EndDate 보다 크면 Result.EndDate Update
  313. var result = request.FmsWorkResult;
  314. if (result == null) throw new ServiceException("존재하지 않는 데이터 입니다.");
  315. var checkItem = result.FmsWorkResultCheckItem.OrderByDescending(x => x.CheckDate).FirstOrDefault();
  316. if (checkItem != null) {
  317. if (checkItem.CheckDate.Date > result.EndDate.Date) {
  318. result.EndDate = checkItem.CheckDate.Date;
  319. _context.FmsWorkResult.Update(result);
  320. _context.SaveChanges();
  321. }
  322. } else {
  323. if (result.StartDate.Date < DateTime.Now.Date) {
  324. result.EndDate = DateTime.Now.Date;
  325. _context.FmsWorkResult.Update(result);
  326. _context.SaveChanges();
  327. }
  328. }
  329. request.WorkProgressId = 5;
  330. _context.FmsWorkRequest.Update(request);
  331. _context.SaveChanges();
  332. trans.Complete();
  333. }
  334. }
  335. public void Hold(FmsWorkRequest data) {
  336. using (var trans = new TransactionScope()) {
  337. var request = _context.FmsWorkRequest.FirstOrDefault(
  338. x => x.SiteId == data.SiteId
  339. && x.WorkRequestId == data.WorkRequestId
  340. );
  341. if (request == null) throw new Exception("존재하지 않는 데이터 입니다.");
  342. if (request.WorkProgressId != 4) {
  343. throw new ServiceException("진행상태의 작업이 아닙니다.");
  344. }
  345. request.WorkProgressId = 7;
  346. _context.FmsWorkRequest.Update(request);
  347. _context.SaveChanges();
  348. trans.Complete();
  349. }
  350. }
  351. // 작업승인
  352. public void Confirm(FmsWorkResult data, DateTime? date) {
  353. using (var trans = new TransactionScope()) {
  354. var result = _context.FmsWorkResult.FirstOrDefault(
  355. x => x.SiteId == data.SiteId
  356. && x.WorkRequestId == data.WorkRequestId
  357. );
  358. if (result == null) throw new Exception("존재하지 않는 데이터 입니다.");
  359. var request = _context.FmsWorkRequest.FirstOrDefault(
  360. x => x.SiteId == data.SiteId
  361. && x.WorkRequestId == data.WorkRequestId
  362. );
  363. if (request == null) throw new Exception("존재하지 않는 데이터 입니다.");
  364. var order = _context.FmsWorkOrder.FirstOrDefault(
  365. x => x.SiteId == data.SiteId
  366. && x.WorkRequestId == data.WorkRequestId
  367. );
  368. if (order == null) throw new Exception("존재하지 않는 데이터 입니다.");
  369. if (request.WorkProgressId != 5) {
  370. throw new ServiceException("작업완료상태의 데이터만 승인 가능합니다.");
  371. }
  372. // save request
  373. request.Content = data.FmsWorkRequest.Content;
  374. request.WorkProgressId = 6;
  375. _context.FmsWorkRequest.Update(request);
  376. _context.SaveChanges();
  377. // save order
  378. order.Content = data.FmsWorkOrder.Content;
  379. _context.FmsWorkOrder.Update(order);
  380. _context.SaveChanges();
  381. // save result
  382. result.Content = data.Content;
  383. result.ConfirmDesc = data.ConfirmDesc;
  384. result.ConfirmedUserId = data.ConfirmedUserId;
  385. result.ConfirmedDate = DateTime.Now;
  386. result.IsConfirmed = true;
  387. _context.FmsWorkResult.Update(result);
  388. _context.SaveChanges();
  389. // 차기 작업 생성
  390. if (request.FmsWorkSchedule != null && !request.FmsWorkSchedule.IsNotProcess) {
  391. if (date == null) {
  392. throw new ServiceException("차기작업 확정일자가 선택되지 않았습니다.");
  393. }
  394. var schedule = _context.FmsWorkSchedule.FirstOrDefault(
  395. x => x.SiteId == data.SiteId
  396. && x.WorkScheduleId == request.WorkScheduleId
  397. );
  398. // 다음 계획일 업데이트
  399. schedule.WorkDueDate = date.Value.Date;
  400. _context.FmsWorkSchedule.Update(schedule);
  401. _context.SaveChanges();
  402. // 작업계획 생성
  403. if (!_workRequestRepository.IsCreatedRequest(schedule)) {
  404. _workRequestRepository.CreateFromWorkSchedule(schedule);
  405. }
  406. }
  407. trans.Complete();
  408. }
  409. }
  410. // 작업승인 및 추가정보 저장
  411. public void ConfirmWithAdditionalData(FmsWorkResult data, DateTime? date) {
  412. using (var trans = new TransactionScope()) {
  413. var result = _context.FmsWorkResult.FirstOrDefault(
  414. x => x.SiteId == data.SiteId
  415. && x.WorkRequestId == data.WorkRequestId
  416. );
  417. if (result == null) throw new Exception("존재하지 않는 데이터 입니다.");
  418. var request = _context.FmsWorkRequest.FirstOrDefault(
  419. x => x.SiteId == data.SiteId
  420. && x.WorkRequestId == data.WorkRequestId
  421. );
  422. if (request == null) throw new Exception("존재하지 않는 데이터 입니다.");
  423. var order = _context.FmsWorkOrder.FirstOrDefault(
  424. x => x.SiteId == data.SiteId
  425. && x.WorkRequestId == data.WorkRequestId
  426. );
  427. if (order == null) throw new Exception("존재하지 않는 데이터 입니다.");
  428. if (request.WorkProgressId != 5) {
  429. throw new ServiceException("작업완료상태의 데이터만 승인 가능합니다.");
  430. }
  431. // save request
  432. request.Content = data.FmsWorkRequest.Content;
  433. request.WorkProgressId = 6;
  434. request.WorkUsers = data.FmsWorkRequest.WorkUsers;
  435. request.WorkDate = data.FmsWorkRequest.WorkDate;
  436. request.WorkPartnerId = data.FmsWorkRequest.WorkPartnerId;
  437. _context.FmsWorkRequest.Update(request);
  438. _context.SaveChanges();
  439. // save order
  440. order.Content = data.FmsWorkOrder.Content;
  441. _context.FmsWorkOrder.Update(order);
  442. _context.SaveChanges();
  443. // save result
  444. result.Content = data.Content;
  445. result.StartDate = data.StartDate;
  446. result.EndDate = data.EndDate;
  447. result.ConfirmDesc = data.ConfirmDesc;
  448. result.ConfirmedUserId = data.ConfirmedUserId;
  449. result.ConfirmedDate = DateTime.Now;
  450. result.IsConfirmed = true;
  451. _context.FmsWorkResult.Update(result);
  452. _context.SaveChanges();
  453. // 차기 작업 생성
  454. if (request.FmsWorkSchedule != null && !request.FmsWorkSchedule.IsNotProcess) {
  455. if (date == null) {
  456. throw new ServiceException("차기작업 확정일자가 선택되지 않았습니다.");
  457. }
  458. var schedule = _context.FmsWorkSchedule.FirstOrDefault(
  459. x => x.SiteId == data.SiteId
  460. && x.WorkScheduleId == request.WorkScheduleId
  461. );
  462. // 다음 계획일 업데이트
  463. schedule.WorkDueDate = date.Value.Date;
  464. _context.FmsWorkSchedule.Update(schedule);
  465. _context.SaveChanges();
  466. // 작업계획 생성
  467. if (!_workRequestRepository.IsCreatedRequest(schedule)) {
  468. _workRequestRepository.CreateFromWorkSchedule(schedule);
  469. }
  470. }
  471. trans.Complete();
  472. }
  473. }
  474. // 자재출고
  475. public void MaterialRelease(FmsWorkResultCheckItemMaterial item, FmsWorkRequest request, string confirmedUserId) {
  476. var material = _context.FmsMaterial.FirstOrDefault(
  477. x => x.SiteId == item.SiteId
  478. && x.MaterialId == item.MaterialId
  479. );
  480. if (material == null) return;
  481. var release = new FmsMaterialRelease() {
  482. SiteId = item.SiteId,
  483. BusinessFieldId = request.BusinessFieldId,
  484. ReleaseDate = DateTime.Now,
  485. ReleaseTypeId = 1, // 작업출고
  486. WorkRequestId = request.WorkRequestId,
  487. CheckItemMaterialId = item.CheckItemMaterialId,
  488. MaterialId = item.MaterialId,
  489. MaterialCount = item.MaterialCount,
  490. ReleaseTotalCost = 0,
  491. ConfirmedUserId = confirmedUserId,
  492. ConfirmedDate = DateTime.Now,
  493. IsConfirmed = true,
  494. AdjustmentTypeId = 0,
  495. };
  496. // 선입선출에 따른 계산 (입고된 자재중 오래된 입고자재의 단가를 먼저 가져온다.)
  497. var storedList = material.FmsMaterialStored.Where(
  498. x => x.IsApproval == true
  499. && x.RemainStoredCount > 0
  500. ).OrderBy(x => x.StoredDate).ToList();
  501. var tempReleasedItemCount = item.MaterialCount;
  502. foreach (var storedItem in storedList) {
  503. if ((storedItem.RemainStoredCount - tempReleasedItemCount) >= 0) {
  504. release.ReleaseTotalCost += (storedItem.UnitCost * tempReleasedItemCount);
  505. storedItem.RemainStoredCount -= tempReleasedItemCount;
  506. release.FmsMaterialReleaseDetail.Add(new FmsMaterialReleaseDetail() {
  507. SiteId = storedItem.SiteId,
  508. MaterialStoredId = storedItem.MaterialStoredId,
  509. MaterialCount = tempReleasedItemCount,
  510. });
  511. tempReleasedItemCount = 0;
  512. break;
  513. }
  514. release.ReleaseTotalCost += (storedItem.UnitCost * storedItem.RemainStoredCount);
  515. tempReleasedItemCount -= storedItem.RemainStoredCount;
  516. release.FmsMaterialReleaseDetail.Add(new FmsMaterialReleaseDetail() {
  517. SiteId = storedItem.SiteId,
  518. MaterialStoredId = storedItem.MaterialStoredId,
  519. MaterialCount = storedItem.RemainStoredCount,
  520. });
  521. storedItem.RemainStoredCount = 0;
  522. }
  523. if (tempReleasedItemCount > 0) {
  524. throw new ServiceException(item.FmsMaterial.Name + " 자재의 입고수량이 부족하여 출고처리가 불가능합니다.");
  525. }
  526. _context.FmsMaterialRelease.Add(release);
  527. _context.SaveChanges();
  528. }
  529. // 자재 출고 삭제
  530. public void RemoveMaterialRelease(FmsWorkResultCheckItemMaterial item) {
  531. var releaseList = _context.FmsMaterialRelease.Where(
  532. x => x.MaterialId == item.MaterialId
  533. && x.WorkRequestId == item.WorkRequestId
  534. && x.CheckItemMaterialId == item.CheckItemMaterialId
  535. ).ToList();
  536. foreach (var release in releaseList) {
  537. foreach (var detail in release.FmsMaterialReleaseDetail) {
  538. // 차감 수량 되돌림
  539. var stored = detail.FmsMaterialStored;
  540. stored.RemainStoredCount += detail.MaterialCount;
  541. _context.FmsMaterialStored.Update(stored);
  542. // 디테일 삭제
  543. _context.FmsMaterialReleaseDetail.Remove(detail);
  544. }
  545. // 출고 삭제
  546. _context.FmsMaterialRelease.Remove(release);
  547. }
  548. _context.SaveChanges();
  549. }
  550. // 차기작업 확정일자 및 현작업 종료일, 작업계획사용여부 조회
  551. public dynamic GetAvailDueDate(int siteId, int workRequestId) {
  552. DateTime WorkDueDate = DateTime.Now.Date;
  553. DateTime EndDate = DateTime.Now.Date;
  554. var result = _context.FmsWorkResult.FirstOrDefault(
  555. x => x.SiteId == siteId
  556. && x.WorkRequestId == workRequestId
  557. );
  558. if (result == null) return new { WorkDueDate, EndDate, IsUse = false };
  559. EndDate = result.EndDate.Date;
  560. var request = _context.FmsWorkRequest.FirstOrDefault(
  561. x => x.SiteId == siteId
  562. && x.WorkRequestId == workRequestId
  563. );
  564. if (request == null) return new { WorkDueDate, EndDate, IsUse = false };
  565. var schedule = _context.FmsWorkSchedule.FirstOrDefault(
  566. x => x.SiteId == siteId
  567. && x.WorkScheduleId == request.WorkScheduleId
  568. );
  569. if (schedule == null) return new { WorkDueDate, EndDate, IsUse = false };
  570. switch (schedule.CycleUnitId) {
  571. case 1: WorkDueDate = EndDate.AddDays(schedule.CycleSize); break;
  572. case 2: WorkDueDate = EndDate.AddDays(schedule.CycleSize * 7); break;
  573. case 3: WorkDueDate = EndDate.AddMonths(schedule.CycleSize); break;
  574. case 4: WorkDueDate = EndDate.AddMonths(schedule.CycleSize * 3); break;
  575. case 5: WorkDueDate = EndDate.AddMonths(schedule.CycleSize * 6); break;
  576. case 6: WorkDueDate = EndDate.AddYears(schedule.CycleSize); break;
  577. }
  578. if (schedule.HolidayWorkTypeId == 0) return new { WorkDueDate, EndDate, IsUse = schedule.IsUse };
  579. var weekend = _holidayRepository.GetHolidayWeekend(siteId);
  580. var holidays = _holidayRepository.GetHolidays(siteId);
  581. bool isHoliday = _holidayRepository.IsHoliday(WorkDueDate, weekend, holidays);
  582. if (schedule.HolidayWorkTypeId == 1) {
  583. while (!isHoliday) {
  584. WorkDueDate = WorkDueDate.AddDays(1);
  585. isHoliday = _holidayRepository.IsHoliday(WorkDueDate, weekend, holidays);
  586. }
  587. return new { WorkDueDate, EndDate, IsUse = schedule.IsUse };
  588. }
  589. if (schedule.HolidayWorkTypeId == 2) {
  590. while (isHoliday) {
  591. WorkDueDate = WorkDueDate.AddDays(1);
  592. isHoliday = _holidayRepository.IsHoliday(WorkDueDate, weekend, holidays);
  593. }
  594. return new { WorkDueDate, EndDate, IsUse = schedule.IsUse };
  595. }
  596. return new { WorkDueDate, EndDate, IsUse = schedule.IsUse };
  597. }
  598. public void Delete(int siteId, int workRequestId) {
  599. using (var trans = new TransactionScope()) {
  600. var checkItemMaterials = _context.FmsWorkResultCheckItemMaterial.Where(
  601. x => x.SiteId == siteId
  602. && x.WorkRequestId == workRequestId
  603. ).ToList();
  604. foreach (var item in checkItemMaterials) {
  605. RemoveMaterialRelease(item);
  606. _context.FmsWorkResultCheckItemMaterial.Remove(item);
  607. }
  608. _context.SaveChanges();
  609. var releases = _context.FmsMaterialRelease.Where(
  610. x => x.SiteId == siteId
  611. && x.WorkRequestId == workRequestId
  612. ).ToList();
  613. foreach (var release in releases) {
  614. var details = _context.FmsMaterialReleaseDetail.Where(
  615. x => x.MaterialReleaseId == release.MaterialReleaseId
  616. ).ToList();
  617. foreach (var detail in details) {
  618. _context.FmsMaterialReleaseDetail.Remove(detail);
  619. }
  620. _context.FmsMaterialRelease.Remove(release);
  621. }
  622. _context.SaveChanges();
  623. var checkItems = _context.FmsWorkResultCheckItem.Where(
  624. x => x.SiteId == siteId
  625. && x.WorkRequestId == workRequestId
  626. ).ToList();
  627. foreach (var item in checkItems) {
  628. _context.FmsWorkResultCheckItem.Remove(item);
  629. }
  630. _context.SaveChanges();
  631. var workResultToFacilities = _context.FmsWorkResultToFacility.Where(
  632. x => x.SiteId == siteId
  633. && x.WorkRequestId == workRequestId
  634. ).ToList();
  635. foreach (var item in workResultToFacilities) {
  636. _context.FmsWorkResultToFacility.Remove(item);
  637. }
  638. _context.SaveChanges();
  639. var workResult = _context.FmsWorkResult.Where(
  640. x => x.SiteId == siteId
  641. && x.WorkRequestId == workRequestId
  642. ).ToList();
  643. foreach (var item in workResult) {
  644. _context.FmsWorkResult.Remove(item);
  645. }
  646. _context.SaveChanges();
  647. var workOrderToFacilities = _context.FmsWorkOrderToFacility.Where(
  648. x => x.SiteId == siteId
  649. && x.WorkRequestId == workRequestId
  650. ).ToList();
  651. foreach (var item in workOrderToFacilities) {
  652. _context.FmsWorkOrderToFacility.Remove(item);
  653. }
  654. _context.SaveChanges();
  655. var workOrder = _context.FmsWorkOrder.Where(
  656. x => x.SiteId == siteId
  657. && x.WorkRequestId == workRequestId
  658. ).ToList();
  659. foreach (var item in workOrder) {
  660. _context.FmsWorkOrder.Remove(item);
  661. }
  662. _context.SaveChanges();
  663. var workRequestToFacilities = _context.FmsWorkRequestToFacility.Where(
  664. x => x.SiteId == siteId
  665. && x.WorkRequestId == workRequestId
  666. ).ToList();
  667. foreach (var item in workRequestToFacilities) {
  668. _context.FmsWorkRequestToFacility.Remove(item);
  669. }
  670. _context.SaveChanges();
  671. var workRequestToAccidents = _context.FmsWorkRequestToAccident.Where(
  672. x => x.SiteId == siteId
  673. && x.WorkRequestId == workRequestId
  674. ).ToList();
  675. foreach (var item in workRequestToAccidents) {
  676. _context.FmsWorkRequestToAccident.Remove(item);
  677. }
  678. _context.SaveChanges();
  679. var workRequestToComplaints = _context.FmsWorkRequestToComplaint.Where(
  680. x => x.SiteId == siteId
  681. && x.WorkRequestId == workRequestId
  682. ).ToList();
  683. foreach (var item in workRequestToComplaints) {
  684. _context.FmsWorkRequestToComplaint.Remove(item);
  685. }
  686. _context.SaveChanges();
  687. var workRequest = _context.FmsWorkRequest.FirstOrDefault(
  688. x => x.SiteId == siteId
  689. && x.WorkRequestId == workRequestId
  690. );
  691. var workSchedule = workRequest.FmsWorkSchedule;
  692. _context.FmsWorkRequest.Remove(workRequest);
  693. _context.SaveChanges();
  694. if (workSchedule != null && workSchedule.IsNotProcess) {
  695. var requestCount = _context.FmsWorkRequest.Count(x => x.SiteId == siteId && x.WorkScheduleId == workSchedule.WorkScheduleId);
  696. if (requestCount <= 0) {
  697. foreach (var facility in workSchedule.FmsWorkScheduleToFacility.ToList()) {
  698. _context.FmsWorkScheduleToFacility.Remove(facility);
  699. }
  700. _context.FmsWorkSchedule.Remove(workSchedule);
  701. _context.SaveChanges();
  702. }
  703. }
  704. trans.Complete();
  705. }
  706. // 차기작업 생성 않해도 되나?
  707. }
  708. public IQueryable<FmsWorkResult> GetAll() {
  709. var query = _context.FmsWorkResult;
  710. return query;
  711. }
  712. public IQueryable<CalendarEvent> GetRequestResult(int? siteId, DateTime startDate, DateTime endDate) {
  713. var query = (from x in _context.FmsWorkRequest
  714. where x.SiteId == (siteId != null ? siteId : x.SiteId)
  715. where x.StartWorkDate.Date >= startDate.Date
  716. where x.StartWorkDate.Date <= endDate.Date
  717. group x by x.StartWorkDate.Date into g
  718. select new {
  719. WorkDate = g.Key,
  720. Count = g.Count(),
  721. ConfirmCount = 0,
  722. }).Concat(
  723. from x in _context.FmsWorkResult
  724. where x.SiteId == (siteId != null ? siteId : x.SiteId)
  725. where x.FmsWorkRequest.StartWorkDate.Date >= startDate.Date
  726. where x.FmsWorkRequest.StartWorkDate.Date <= endDate.Date
  727. where x.FmsWorkRequest.WorkProgressId == 6
  728. group x by x.FmsWorkRequest.StartWorkDate.Date into g
  729. select new {
  730. WorkDate = g.Key,
  731. Count = 0,
  732. ConfirmCount = g.Count(),
  733. }
  734. );
  735. var query2 = from x in query
  736. group x by x.WorkDate into g
  737. select new CalendarEvent {
  738. Title = "계획 : " + g.Sum(x => x.Count).ToString("#,##0") + " 건 / 완료 : " + g.Sum(x => x.ConfirmCount).ToString("#,##0") + " 건",
  739. RequestCount = g.Sum(x => x.Count),
  740. ConfirmCount = g.Sum(x => x.ConfirmCount),
  741. Start = g.Key.ToString("yyyy-MM-dd"),
  742. End = g.Key.ToString("yyyy-MM-dd"),
  743. WorkType = "계획_완료",
  744. GroupId = 3,
  745. Id = g.Key.ToString("yyyy-MM-dd"),
  746. };
  747. return query2;
  748. }
  749. public IQueryable<FmsWorkRequest> GetCustomRequestResultList(int? siteId, DateTime startDate, DateTime endDate) {
  750. var query = _context.FmsWorkRequest.Where(x =>
  751. x.SiteId == (siteId != null ? siteId : x.SiteId) &&
  752. x.StartWorkDate.Date >= startDate.Date &&
  753. x.StartWorkDate.Date <= endDate.Date);
  754. return query;
  755. }
  756. }
  757. }