MaterialStoredService.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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 MaterialStoredService {
  17. private readonly ILogger<MaterialStoredService> _logger;
  18. private readonly FMSContext _context;
  19. private readonly StorageHelper _storage;
  20. public MaterialStoredService(
  21. ILogger<MaterialStoredService> logger,
  22. FMSContext context,
  23. StorageHelper storage) {
  24. _logger = logger;
  25. _context = context;
  26. _storage = storage;
  27. }
  28. public void Create(FmsMaterialStored data) {
  29. using (var transaction = _context.Database.BeginTransaction()) {
  30. foreach (var item in data.MaterialStoredList) {
  31. FmsMaterialStored storedItem = new FmsMaterialStored() {
  32. SiteId = data.SiteId,
  33. BusinessFieldId = data.BusinessFieldId,
  34. StoredUserId = data.StoredUserId,
  35. StoredDate = DateTime.Now,
  36. PurchaseOrderId = data.PurchaseOrderId,
  37. WarehouseId = data.WarehouseId,
  38. MaterialId = item.MaterialId,
  39. StoredCount = item.StoredCount,
  40. RemainStoredCount = item.StoredCount, // 입고등록시 RemainStoredCount 에 입고수량 넣어야함 (출고시 RemainStoredCount 이용해서 출고함)
  41. UnitCost = item.UnitCost,
  42. StockCount = 0,
  43. Note = data.Note,
  44. IsApproval = false,
  45. LocationInWarehouse = data.LocationInWarehouse,
  46. };
  47. storedItem.StoredUserId = data.StoredUserId;
  48. //해당 material 의 최신 입고 정보
  49. var lastStoredItem = _context.FmsMaterialStored.Where(x => x.SiteId == data.SiteId && x.MaterialId == item.MaterialId).OrderByDescending(x => x.MaterialStoredId).FirstOrDefault();
  50. //재고정보 업데이트
  51. if (lastStoredItem != null) {
  52. storedItem.StockCount += (lastStoredItem.StockCount + item.StoredCount);
  53. } else {
  54. storedItem.StockCount = item.StoredCount;
  55. }
  56. //자동승인
  57. if (_context.SiteConfig.Single().UseMaterialStoredAutoApproval) {
  58. storedItem.ApprovalUserId = data.StoredUserId;
  59. storedItem.ApprovalDate = DateTime.Now;
  60. storedItem.IsApproval = true;
  61. }
  62. _context.FmsMaterialStored.Add(storedItem);
  63. }
  64. _context.SaveChanges();
  65. // 발주요청과 입고를 비교하여 모두 입고되었다면 상태 변경
  66. var storedMaterialList = _context.FmsMaterialStored.Where(x => x.SiteId == data.SiteId && x.PurchaseOrderId == data.PurchaseOrderId).ToList();
  67. var orderdMaterialList = _context.FmsMaterialPurchaseOrderMaterial.Where(x => x.SiteId == data.SiteId && x.PurchaseOrderId == data.PurchaseOrderId).ToList();
  68. bool bAllStored = false;
  69. foreach (var order in orderdMaterialList) {
  70. int storedCount = storedMaterialList.Where(x => x.MaterialId == order.MaterialId).Sum(x => x.StoredCount);
  71. if (order.MaterialCount > storedCount) {
  72. bAllStored = false;
  73. break;
  74. } else {
  75. bAllStored = true;
  76. }
  77. }
  78. if (bAllStored) {
  79. var requestId = _context.FmsMaterialPurchaseOrder.Where(x => x.SiteId == data.SiteId && x.PurchaseOrderId == data.PurchaseOrderId).Select(x => x.PurchaseRequestId).FirstOrDefault();
  80. var materialRequiest = _context.FmsMaterialPurchaseRequest.Where(x => x.SiteId == data.SiteId && x.PurchaseRequestId == requestId).FirstOrDefault();
  81. if (materialRequiest != null) {
  82. if (_context.SiteConfig.Single().UseMaterialStoredAutoApproval) {
  83. materialRequiest.ProgressId = 5; //입고승인
  84. } else {
  85. materialRequiest.ProgressId = 4; //자재입고
  86. }
  87. _context.FmsMaterialPurchaseRequest.Update(materialRequiest);
  88. _context.SaveChanges();
  89. }
  90. }
  91. transaction.Commit();
  92. }
  93. }
  94. public IQueryable<FmsMaterialStored> GetAll() {
  95. var query = _context.FmsMaterialStored/*.AsNoTracking()*/;
  96. return query;
  97. }
  98. public FmsMaterialStored Get(int id, int siteId) {
  99. var data = _context.FmsMaterialStored.Single(x => x.MaterialStoredId == id && x.SiteId == siteId);
  100. return data;
  101. }
  102. public IQueryable<FmsMaterialStored> Gets(int id, int siteId) {
  103. var data = _context.FmsMaterialStored.Where(x => x.MaterialStoredId == id && x.SiteId == siteId);
  104. return data;
  105. }
  106. public void Delete(int id, int siteId) {
  107. var data = _context.FmsMaterialStored.First(x => x.MaterialStoredId == id && x.SiteId == siteId);
  108. _context.FmsMaterialStored.Remove(data);
  109. _context.SaveChanges();
  110. }
  111. public void Approval(string userId, FmsMaterialStored data) {
  112. var persist = _context.FmsMaterialStored
  113. .Where(x => x.MaterialStoredId == data.MaterialStoredId && x.SiteId == data.SiteId).FirstOrDefault();
  114. if (persist == null) {
  115. throw new ServiceException("정보를 찾을 수 없습니다.");
  116. }
  117. using (var transaction = _context.Database.BeginTransaction()) {
  118. var order = _context.FmsMaterialPurchaseOrder.Where(x => x.SiteId == persist.SiteId && x.BusinessFieldId == persist.BusinessFieldId && x.PurchaseOrderId == persist.PurchaseOrderId).FirstOrDefault();
  119. if (order != null) {
  120. persist.ApprovalUserId = userId;
  121. persist.ApprovalDate = DateTime.Now;
  122. persist.IsApproval = true;
  123. }
  124. _context.FmsMaterialStored.Update(persist);
  125. // 발주요청과 입고를 비교하여 모두 입고되었다면 상태 변경
  126. bool bAllMaterialStored = false;
  127. foreach (var orderMaterial in order.FmsMaterialPurchaseOrderMaterial) {
  128. var notApprovedItem = order.FmsMaterialStored.Where(x => x.SiteId == orderMaterial.SiteId && x.IsApproval == false).FirstOrDefault();
  129. if (notApprovedItem != null) {
  130. bAllMaterialStored = false;
  131. break;
  132. }
  133. int storedCount = order.FmsMaterialStored.Where(x => x.SiteId == orderMaterial.SiteId && x.MaterialId == orderMaterial.MaterialId).Sum(x => x.StoredCount);
  134. if (orderMaterial.MaterialCount > storedCount) {
  135. bAllMaterialStored = false;
  136. break;
  137. } else {
  138. bAllMaterialStored = true;
  139. }
  140. }
  141. if (bAllMaterialStored) {
  142. order.FmsMaterialPurchaseRequest.ProgressId = 5; //입고승인
  143. _context.FmsMaterialPurchaseOrder.Update(order);
  144. }
  145. _context.SaveChanges();
  146. transaction.Commit();
  147. }
  148. }
  149. public void ApprovalEach(int siteId, int id, string userId) {
  150. var persist = _context.FmsMaterialStored.Where(x => x.MaterialStoredId == id && x.SiteId == siteId).FirstOrDefault();
  151. if (persist == null) {
  152. throw new ServiceException("정보를 찾을 수 없습니다.");
  153. }
  154. Approval(userId, persist);
  155. }
  156. }
  157. }