MaterialOrderStatusByStoredService.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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 MaterialOrderStatusByStoredService {
  17. private readonly ILogger<MaterialOrderStatusByStoredService> _logger;
  18. private readonly FMSContext _context;
  19. private readonly StorageHelper _storage;
  20. public MaterialOrderStatusByStoredService(
  21. ILogger<MaterialOrderStatusByStoredService> logger,
  22. FMSContext context,
  23. StorageHelper storage) {
  24. _logger = logger;
  25. _context = context;
  26. _storage = storage;
  27. }
  28. public IQueryable<FmsMaterialPurchaseOrderMaterial> GetAll() {
  29. var query = _context.FmsMaterialPurchaseOrderMaterial/*.AsNoTracking()*/;
  30. return query;
  31. }
  32. public FmsMaterialStored Get(int id, int siteId) {
  33. var data = _context.FmsMaterialStored.Single(x => x.MaterialStoredId == id && x.SiteId == siteId);
  34. return data;
  35. }
  36. public IQueryable<FmsMaterialPurchaseOrderMaterial> Gets(int orderId, int materialId, int siteId) {
  37. var data = _context.FmsMaterialPurchaseOrderMaterial.Where(x => x.PurchaseOrderId == orderId && x.SiteId == siteId && x.MaterialId == materialId);
  38. return data;
  39. }
  40. public void Stored(int siteId, int orderId, int materialId, string userId, bool authBusiness) {
  41. using (var transaction = _context.Database.BeginTransaction()) {
  42. var orderItem = _context.FmsMaterialPurchaseOrderMaterial.Where(x => x.SiteId == siteId && x.PurchaseOrderId == orderId && x.MaterialId == materialId).ToList();
  43. var userInfo = _context.CmUser.Where(x => x.UserId == userId).SingleOrDefault();
  44. foreach (var item in orderItem) {
  45. var tmpWarehouse = _context.FmsMaterialWarehouse.Where(f => f.SiteId == item.SiteId && (f.BusinessFieldId == userInfo.BusinessFieldId || f.CmBusinessField.Name == "공통")).FirstOrDefault();
  46. if (tmpWarehouse == null) {
  47. if (authBusiness) {
  48. throw new ServiceException("보관창고를 먼저 등록해 주세요.");
  49. } else {
  50. tmpWarehouse = _context.FmsMaterialWarehouse.Where(f => f.SiteId == item.SiteId).FirstOrDefault();
  51. if (tmpWarehouse == null) {
  52. throw new ServiceException("보관창고를 먼저 등록해 주세요.");
  53. }
  54. }
  55. }
  56. FmsMaterialStored storedItem = new FmsMaterialStored() {
  57. SiteId = item.SiteId,
  58. BusinessFieldId = item.FmsMaterialPurchaseOrder.BusinessFieldId,
  59. StoredUserId = userId,
  60. StoredDate = DateTime.Now,
  61. PurchaseOrderId = item.PurchaseOrderId,
  62. WarehouseId = tmpWarehouse.WarehouseId,
  63. MaterialId = item.MaterialId,
  64. StoredCount = item.MaterialCount - item.FmsMaterialPurchaseOrder.FmsMaterialStored.Where(f => f.MaterialId == item.MaterialId).Sum(f => f.StoredCount),
  65. RemainStoredCount = item.MaterialCount - item.FmsMaterialPurchaseOrder.FmsMaterialStored.Where(f => f.MaterialId == item.MaterialId).Sum(f => f.StoredCount), // 입고등록시 RemainStoredCount 에 입고수량 넣어야함 (출고시 RemainStoredCount 이용해서 출고함)
  66. UnitCost = item.UnitCost,
  67. StockCount = 0,
  68. Note = "",
  69. IsApproval = false,
  70. LocationInWarehouse = "",
  71. };
  72. //해당 material 의 최신 입고 정보
  73. var lastStoredItem = _context.FmsMaterialStored.Where(x => x.SiteId == item.SiteId && x.MaterialId == item.MaterialId).OrderByDescending(x => x.MaterialStoredId).FirstOrDefault();
  74. //재고정보 업데이트
  75. if (lastStoredItem != null) {
  76. storedItem.StockCount += (lastStoredItem.StockCount + storedItem.StoredCount);
  77. } else {
  78. storedItem.StockCount = storedItem.StoredCount;
  79. }
  80. //자동승인
  81. // if (_context.SiteConfig.Single().UseMaterialStoredAutoApproval) {
  82. // storedItem.ApprovalUserId = userId;
  83. // storedItem.ApprovalDate = DateTime.Now;
  84. // storedItem.IsApproval = true;
  85. // }
  86. _context.FmsMaterialStored.Add(storedItem);
  87. }
  88. _context.SaveChanges();
  89. // 발주요청과 입고를 비교하여 모두 입고되었다면 상태 변경
  90. var storedMaterialList = _context.FmsMaterialStored.Where(x => x.SiteId == siteId && x.PurchaseOrderId == orderId).ToList();
  91. var orderdMaterialList = _context.FmsMaterialPurchaseOrderMaterial.Where(x => x.SiteId == siteId && x.PurchaseOrderId == orderId).ToList();
  92. bool bAllStored = false;
  93. foreach (var order in orderdMaterialList) {
  94. int storedCount = storedMaterialList.Where(x => x.MaterialId == order.MaterialId).Sum(x => x.StoredCount);
  95. if (order.MaterialCount > storedCount) {
  96. bAllStored = false;
  97. break;
  98. } else {
  99. bAllStored = true;
  100. }
  101. }
  102. if (bAllStored) {
  103. var requestId = _context.FmsMaterialPurchaseOrder.Where(x => x.SiteId == siteId && x.PurchaseOrderId == orderId).Select(x => x.PurchaseRequestId).FirstOrDefault();
  104. var materialRequiest = _context.FmsMaterialPurchaseRequest.Where(x => x.SiteId == siteId && x.PurchaseRequestId == requestId).FirstOrDefault();
  105. if (materialRequiest != null) {
  106. // if (_context.SiteConfig.Single().UseMaterialStoredAutoApproval) {
  107. // materialRequiest.ProgressId = 5; //입고승인
  108. // } else {
  109. materialRequiest.ProgressId = 4; //자재입고
  110. // }
  111. _context.FmsMaterialPurchaseRequest.Update(materialRequiest);
  112. _context.SaveChanges();
  113. }
  114. }
  115. transaction.Commit();
  116. }
  117. }
  118. }
  119. }