MaterialReleaseService.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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. namespace FMSAdmin.Services {
  16. public class MaterialReleaseService {
  17. private readonly ILogger<MaterialReleaseService> _logger;
  18. private readonly FMSContext _context;
  19. private readonly StorageHelper _storage;
  20. public MaterialReleaseService(
  21. ILogger<MaterialReleaseService> logger,
  22. FMSContext context,
  23. StorageHelper storage) {
  24. _logger = logger;
  25. _context = context;
  26. _storage = storage;
  27. }
  28. public void Create(FmsMaterialRelease data) {
  29. using (var transaction = _context.Database.BeginTransaction()) {
  30. //재고 체크
  31. foreach (var item in data.MaterialReleaseList) {
  32. if (data.AdjustmentTypeId == 1) {
  33. if (item.MaterialCount > item.StockCountByPoint) {
  34. throw new ServiceException("자재손실은 재고수량 보다 클 수 없습니다.");
  35. }
  36. } else if (data.AdjustmentTypeId == 2) {
  37. int nCnt = 0;
  38. var persist = _context.FmsMaterialStored.Where(x => x.SiteId == item.SiteId && x.MaterialId == item.MaterialId).ToList();
  39. if (persist == null) {
  40. throw new ServiceException("정보를 찾을 수 없습니다.");
  41. }
  42. foreach (var storedItem in persist) {
  43. nCnt += storedItem.StoredCount + storedItem.RemainStoredCount;
  44. }
  45. if (item.MaterialCount <= nCnt) {
  46. item.ReleaseTotalCost = 0;
  47. //data.MaterialReleaseList.Add(item);
  48. } else {
  49. throw new ServiceException("반납할 재고가 없습니다.");
  50. }
  51. }
  52. }
  53. data.ReleaseTypeId = 2; //조정출고
  54. data.ReleaseDate = DateTime.Now;
  55. foreach (var item in data.MaterialReleaseList) {
  56. FmsMaterialRelease releaseItem = new FmsMaterialRelease() {
  57. SiteId = data.SiteId,
  58. BusinessFieldId = data.BusinessFieldId,
  59. ReleaseDate = data.ReleaseDate,
  60. ReleaseTypeId = data.ReleaseTypeId,
  61. MaterialId = item.MaterialId,
  62. MaterialCount = item.MaterialCount,
  63. IsConfirmed = false,
  64. AdjustmentTypeId = data.AdjustmentTypeId,
  65. AdjustmentUserId = data.AdjustmentUserId,
  66. Comment = data.Comment,
  67. ReleaseTotalCost = 0,
  68. StockCountByPoint = item.StockCountByPoint,
  69. };
  70. //선입선출에 따른 계산
  71. if (data.AdjustmentTypeId == 1) { //조정 손실인 경우
  72. var currentStoredList = _context.FmsMaterialStored.Where(x => x.IsApproval == true && x.MaterialId == item.MaterialId && x.RemainStoredCount > 0).OrderBy(x => x.StoredDate).ToList();
  73. int releaseMaterialCount = item.MaterialCount.Value;
  74. foreach (var storedItem in currentStoredList) {
  75. if ((storedItem.RemainStoredCount - releaseMaterialCount) >= 0) {
  76. releaseItem.ReleaseTotalCost += (storedItem.UnitCost * releaseMaterialCount);
  77. storedItem.RemainStoredCount -= releaseMaterialCount;
  78. releaseItem.FmsMaterialReleaseDetail.Add(new FmsMaterialReleaseDetail() {
  79. SiteId = data.SiteId,
  80. MaterialStoredId = storedItem.MaterialStoredId,
  81. MaterialCount = releaseMaterialCount,
  82. FmsMaterialStored = storedItem,
  83. });
  84. _context.FmsMaterialStored.Update(storedItem);
  85. releaseMaterialCount = 0;
  86. break;
  87. }
  88. releaseItem.ReleaseTotalCost += (storedItem.UnitCost * storedItem.RemainStoredCount);
  89. releaseMaterialCount -= storedItem.RemainStoredCount;
  90. releaseItem.FmsMaterialReleaseDetail.Add(new FmsMaterialReleaseDetail() {
  91. SiteId = data.SiteId,
  92. MaterialStoredId = storedItem.MaterialStoredId,
  93. MaterialCount = storedItem.RemainStoredCount,
  94. });
  95. storedItem.RemainStoredCount = 0;
  96. _context.FmsMaterialStored.Update(storedItem);
  97. }
  98. if (releaseMaterialCount > 0) {
  99. throw new ServiceException("자재손실은 재고수량 보다 클 수 없습니다.");
  100. }
  101. } else if (data.AdjustmentTypeId == 2) { //조정 반납인 경우
  102. var currentStoredList = _context.FmsMaterialStored.Where(x => x.IsApproval == true && x.MaterialId == item.MaterialId && x.StoredCount != x.RemainStoredCount).OrderByDescending(x => x.StoredDate).ToList();
  103. int releaseMaterialCount = item.MaterialCount.Value;
  104. foreach (var storedItem in currentStoredList) {
  105. if ((storedItem.RemainStoredCount + releaseMaterialCount) <= storedItem.StoredCount) {
  106. releaseItem.ReleaseTotalCost += (storedItem.UnitCost * releaseMaterialCount);
  107. storedItem.RemainStoredCount += releaseMaterialCount;
  108. releaseItem.FmsMaterialReleaseDetail.Add(new FmsMaterialReleaseDetail() {
  109. SiteId = data.SiteId,
  110. MaterialStoredId = storedItem.MaterialStoredId,
  111. MaterialCount = releaseMaterialCount * -1,
  112. FmsMaterialStored = storedItem,
  113. });
  114. _context.FmsMaterialStored.Update(storedItem);
  115. break;
  116. }
  117. var returnItemCount = storedItem.StoredCount - storedItem.RemainStoredCount;
  118. releaseItem.ReleaseTotalCost += (storedItem.UnitCost * returnItemCount);
  119. releaseMaterialCount -= returnItemCount;
  120. storedItem.RemainStoredCount = storedItem.StoredCount;
  121. releaseItem.FmsMaterialReleaseDetail.Add(new FmsMaterialReleaseDetail() {
  122. SiteId = data.SiteId,
  123. MaterialStoredId = storedItem.MaterialStoredId,
  124. MaterialCount = storedItem.StoredCount * -1,
  125. FmsMaterialStored = storedItem,
  126. });
  127. _context.FmsMaterialStored.Update(storedItem);
  128. }
  129. }
  130. if (_context.SiteConfig.Single().UseMaterialAdjustmentAutoApproval) {
  131. releaseItem.IsConfirmed = true;
  132. releaseItem.ConfirmedUserId = data.AdjustmentUserId;
  133. releaseItem.ConfirmedDate = DateTime.Now;
  134. }
  135. _context.FmsMaterialRelease.Add(releaseItem);
  136. }
  137. _context.SaveChanges();
  138. transaction.Commit();
  139. }
  140. }
  141. public void Edit(int id, int siteId, FmsMaterialRelease data) {
  142. var persist = _context.FmsMaterialRelease
  143. .Where(x => x.MaterialReleaseId == id && x.SiteId == siteId).FirstOrDefault();
  144. if (persist == null) {
  145. throw new ServiceException("정보를 찾을 수 없습니다.");
  146. }
  147. using (var transaction = _context.Database.BeginTransaction()) {
  148. persist.MaterialCount = data.MaterialReleaseList.Select(x => x.MaterialCount).FirstOrDefault();
  149. _context.FmsMaterialRelease.Update(persist);
  150. _context.SaveChanges();
  151. transaction.Commit();
  152. }
  153. }
  154. public IQueryable<FmsMaterialRelease> GetAll() {
  155. var query = _context.FmsMaterialRelease/*.AsNoTracking()*/;
  156. return query;
  157. }
  158. public FmsMaterialRelease Get(int id, int siteId) {
  159. var data = _context.FmsMaterialRelease.Single(x => x.MaterialReleaseId == id && x.SiteId == siteId);
  160. return data;
  161. }
  162. public IQueryable<FmsMaterialRelease> Gets(int id, int siteId) {
  163. var data = _context.FmsMaterialRelease.Where(x => x.MaterialReleaseId == id && x.SiteId == siteId);
  164. return data;
  165. }
  166. public void Delete(int id, int siteId) {
  167. using (var transaction = _context.Database.BeginTransaction()) {
  168. var releaseDetail = _context.FmsMaterialReleaseDetail.First(x => x.MaterialReleaseId == id && x.SiteId == siteId);
  169. _context.FmsMaterialReleaseDetail.Remove(releaseDetail);
  170. _context.SaveChanges();
  171. var data = _context.FmsMaterialRelease.First(x => x.MaterialReleaseId == id && x.SiteId == siteId);
  172. _context.FmsMaterialRelease.Remove(data);
  173. _context.SaveChanges();
  174. transaction.Commit();
  175. }
  176. }
  177. public void Approval(string userId, ICollection<FmsMaterialRelease> data) {
  178. using (var transaction = _context.Database.BeginTransaction()) {
  179. foreach (var item in data) {
  180. if (item.IsConfirmed == true) continue;
  181. var persist = _context.FmsMaterialRelease
  182. .Where(x => x.MaterialReleaseId == item.MaterialReleaseId && x.SiteId == item.SiteId).FirstOrDefault();
  183. if (persist == null) {
  184. throw new ServiceException("정보를 찾을 수 없습니다.");
  185. }
  186. persist.IsConfirmed = true;
  187. persist.ConfirmedUserId = userId;
  188. persist.ConfirmedDate = DateTime.Now;
  189. _context.FmsMaterialRelease.Update(persist);
  190. _context.SaveChanges();
  191. }
  192. transaction.Commit();
  193. }
  194. }
  195. public void ApprovalEach(int siteId, int id, string userId) {
  196. var persist = _context.FmsMaterialRelease
  197. .Where(x => x.MaterialReleaseId == id && x.SiteId == siteId).FirstOrDefault();
  198. if (persist == null) {
  199. throw new ServiceException("정보를 찾을 수 없습니다.");
  200. }
  201. using (var transaction = _context.Database.BeginTransaction()) {
  202. persist.IsConfirmed = true;
  203. persist.ConfirmedUserId = userId;
  204. persist.ConfirmedDate = DateTime.Now;
  205. _context.FmsMaterialRelease.Update(persist);
  206. _context.SaveChanges();
  207. transaction.Commit();
  208. }
  209. }
  210. }
  211. }