123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- using System;
- using System.Collections.Generic;
- using System.IdentityModel.Tokens.Jwt;
- using System.Linq;
- using System.Security.Claims;
- using System.Text;
- using FMSAdmin.Data;
- using FMSAdmin.Helpers;
- using FMSAdmin.Entities;
- using Microsoft.EntityFrameworkCore;
- using Microsoft.Extensions.Logging;
- using Microsoft.Extensions.Options;
- using Microsoft.IdentityModel.Tokens;
- using FMSAdmin.Models;
- namespace FMSAdmin.Services {
- public class MaterialReleaseService {
- private readonly ILogger<MaterialReleaseService> _logger;
- private readonly FMSContext _context;
- private readonly StorageHelper _storage;
- public MaterialReleaseService(
- ILogger<MaterialReleaseService> logger,
- FMSContext context,
- StorageHelper storage) {
- _logger = logger;
- _context = context;
- _storage = storage;
- }
- public void Create(FmsMaterialRelease data) {
- using (var transaction = _context.Database.BeginTransaction()) {
- //재고 체크
- foreach (var item in data.MaterialReleaseList) {
- if (data.AdjustmentTypeId == 1) {
- if (item.MaterialCount > item.StockCountByPoint) {
- throw new ServiceException("자재손실은 재고수량 보다 클 수 없습니다.");
- }
- } else if (data.AdjustmentTypeId == 2) {
- int nCnt = 0;
- var persist = _context.FmsMaterialStored.Where(x => x.SiteId == item.SiteId && x.MaterialId == item.MaterialId).ToList();
- if (persist == null) {
- throw new ServiceException("정보를 찾을 수 없습니다.");
- }
- foreach (var storedItem in persist) {
- nCnt += storedItem.StoredCount + storedItem.RemainStoredCount;
- }
- if (item.MaterialCount <= nCnt) {
- item.ReleaseTotalCost = 0;
- //data.MaterialReleaseList.Add(item);
- } else {
- throw new ServiceException("반납할 재고가 없습니다.");
- }
- }
- }
- data.ReleaseTypeId = 2; //조정출고
- data.ReleaseDate = DateTime.Now;
- foreach (var item in data.MaterialReleaseList) {
- FmsMaterialRelease releaseItem = new FmsMaterialRelease() {
- SiteId = data.SiteId,
- BusinessFieldId = data.BusinessFieldId,
- ReleaseDate = data.ReleaseDate,
- ReleaseTypeId = data.ReleaseTypeId,
- MaterialId = item.MaterialId,
- MaterialCount = item.MaterialCount,
- IsConfirmed = false,
- AdjustmentTypeId = data.AdjustmentTypeId,
- AdjustmentUserId = data.AdjustmentUserId,
- Comment = data.Comment,
- ReleaseTotalCost = 0,
- StockCountByPoint = item.StockCountByPoint,
- };
- //선입선출에 따른 계산
- if (data.AdjustmentTypeId == 1) { //조정 손실인 경우
- var currentStoredList = _context.FmsMaterialStored.Where(x => x.IsApproval == true && x.MaterialId == item.MaterialId && x.RemainStoredCount > 0).OrderBy(x => x.StoredDate).ToList();
- int releaseMaterialCount = item.MaterialCount.Value;
- foreach (var storedItem in currentStoredList) {
- if ((storedItem.RemainStoredCount - releaseMaterialCount) >= 0) {
- releaseItem.ReleaseTotalCost += (storedItem.UnitCost * releaseMaterialCount);
- storedItem.RemainStoredCount -= releaseMaterialCount;
- releaseItem.FmsMaterialReleaseDetail.Add(new FmsMaterialReleaseDetail() {
- SiteId = data.SiteId,
- MaterialStoredId = storedItem.MaterialStoredId,
- MaterialCount = releaseMaterialCount,
- FmsMaterialStored = storedItem,
- });
- _context.FmsMaterialStored.Update(storedItem);
- releaseMaterialCount = 0;
- break;
- }
- releaseItem.ReleaseTotalCost += (storedItem.UnitCost * storedItem.RemainStoredCount);
- releaseMaterialCount -= storedItem.RemainStoredCount;
- releaseItem.FmsMaterialReleaseDetail.Add(new FmsMaterialReleaseDetail() {
- SiteId = data.SiteId,
- MaterialStoredId = storedItem.MaterialStoredId,
- MaterialCount = storedItem.RemainStoredCount,
- });
- storedItem.RemainStoredCount = 0;
- _context.FmsMaterialStored.Update(storedItem);
- }
- if (releaseMaterialCount > 0) {
- throw new ServiceException("자재손실은 재고수량 보다 클 수 없습니다.");
- }
- } else if (data.AdjustmentTypeId == 2) { //조정 반납인 경우
- var currentStoredList = _context.FmsMaterialStored.Where(x => x.IsApproval == true && x.MaterialId == item.MaterialId && x.StoredCount != x.RemainStoredCount).OrderByDescending(x => x.StoredDate).ToList();
- int releaseMaterialCount = item.MaterialCount.Value;
- foreach (var storedItem in currentStoredList) {
- if ((storedItem.RemainStoredCount + releaseMaterialCount) <= storedItem.StoredCount) {
- releaseItem.ReleaseTotalCost += (storedItem.UnitCost * releaseMaterialCount);
- storedItem.RemainStoredCount += releaseMaterialCount;
- releaseItem.FmsMaterialReleaseDetail.Add(new FmsMaterialReleaseDetail() {
- SiteId = data.SiteId,
- MaterialStoredId = storedItem.MaterialStoredId,
- MaterialCount = releaseMaterialCount * -1,
- FmsMaterialStored = storedItem,
- });
- _context.FmsMaterialStored.Update(storedItem);
- break;
- }
- var returnItemCount = storedItem.StoredCount - storedItem.RemainStoredCount;
- releaseItem.ReleaseTotalCost += (storedItem.UnitCost * returnItemCount);
- releaseMaterialCount -= returnItemCount;
- storedItem.RemainStoredCount = storedItem.StoredCount;
- releaseItem.FmsMaterialReleaseDetail.Add(new FmsMaterialReleaseDetail() {
- SiteId = data.SiteId,
- MaterialStoredId = storedItem.MaterialStoredId,
- MaterialCount = storedItem.StoredCount * -1,
- FmsMaterialStored = storedItem,
- });
- _context.FmsMaterialStored.Update(storedItem);
- }
- }
- if (_context.SiteConfig.Single().UseMaterialAdjustmentAutoApproval) {
- releaseItem.IsConfirmed = true;
- releaseItem.ConfirmedUserId = data.AdjustmentUserId;
- releaseItem.ConfirmedDate = DateTime.Now;
- }
- _context.FmsMaterialRelease.Add(releaseItem);
- }
- _context.SaveChanges();
- transaction.Commit();
- }
- }
- public void Edit(int id, int siteId, FmsMaterialRelease data) {
- var persist = _context.FmsMaterialRelease
- .Where(x => x.MaterialReleaseId == id && x.SiteId == siteId).FirstOrDefault();
- if (persist == null) {
- throw new ServiceException("정보를 찾을 수 없습니다.");
- }
- using (var transaction = _context.Database.BeginTransaction()) {
- persist.MaterialCount = data.MaterialReleaseList.Select(x => x.MaterialCount).FirstOrDefault();
- _context.FmsMaterialRelease.Update(persist);
- _context.SaveChanges();
- transaction.Commit();
- }
- }
- public IQueryable<FmsMaterialRelease> GetAll() {
- var query = _context.FmsMaterialRelease/*.AsNoTracking()*/;
- return query;
- }
- public FmsMaterialRelease Get(int id, int siteId) {
- var data = _context.FmsMaterialRelease.Single(x => x.MaterialReleaseId == id && x.SiteId == siteId);
- return data;
- }
- public IQueryable<FmsMaterialRelease> Gets(int id, int siteId) {
- var data = _context.FmsMaterialRelease.Where(x => x.MaterialReleaseId == id && x.SiteId == siteId);
- return data;
- }
- public void Delete(int id, int siteId) {
- using (var transaction = _context.Database.BeginTransaction()) {
- var releaseDetail = _context.FmsMaterialReleaseDetail.First(x => x.MaterialReleaseId == id && x.SiteId == siteId);
- _context.FmsMaterialReleaseDetail.Remove(releaseDetail);
- _context.SaveChanges();
- var data = _context.FmsMaterialRelease.First(x => x.MaterialReleaseId == id && x.SiteId == siteId);
- _context.FmsMaterialRelease.Remove(data);
- _context.SaveChanges();
- transaction.Commit();
- }
- }
- public void Approval(string userId, ICollection<FmsMaterialRelease> data) {
- using (var transaction = _context.Database.BeginTransaction()) {
- foreach (var item in data) {
- if (item.IsConfirmed == true) continue;
- var persist = _context.FmsMaterialRelease
- .Where(x => x.MaterialReleaseId == item.MaterialReleaseId && x.SiteId == item.SiteId).FirstOrDefault();
- if (persist == null) {
- throw new ServiceException("정보를 찾을 수 없습니다.");
- }
- persist.IsConfirmed = true;
- persist.ConfirmedUserId = userId;
- persist.ConfirmedDate = DateTime.Now;
- _context.FmsMaterialRelease.Update(persist);
- _context.SaveChanges();
- }
- transaction.Commit();
- }
- }
- public void ApprovalEach(int siteId, int id, string userId) {
- var persist = _context.FmsMaterialRelease
- .Where(x => x.MaterialReleaseId == id && x.SiteId == siteId).FirstOrDefault();
- if (persist == null) {
- throw new ServiceException("정보를 찾을 수 없습니다.");
- }
- using (var transaction = _context.Database.BeginTransaction()) {
- persist.IsConfirmed = true;
- persist.ConfirmedUserId = userId;
- persist.ConfirmedDate = DateTime.Now;
- _context.FmsMaterialRelease.Update(persist);
- _context.SaveChanges();
- transaction.Commit();
- }
- }
- }
- }
|