using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Diagnostics; using System.Linq; using System.Net; using System.Net.Http; using System.Web; using System.Web.Http; using System.Web.Http.Description; using iBemsDataService; using iBemsDataService.Model; using iBemsDataService.Util; namespace iBemsDataService.Controllers { public class FmsEquipmentRentInfoController : ApiController { private iBemsEntities db = new iBemsEntities(); [ResponseType(typeof(void))] [ActionName("InsertEquipments")] public IHttpActionResult PostFmsEquipmentRentInfoEquipments(List equipments) { if (!ModelState.IsValid) { return BadRequest(ModelState); } Uri uri = Request.RequestUri; var uriQuery = HttpUtility.ParseQueryString(uri.Query); int siteId, equipmentRentId; if (int.TryParse(uriQuery.Get("SiteId"), out siteId) == false || int.TryParse(uriQuery.Get("EquipmentRentId"), out equipmentRentId) == false) { return BadRequest("Not Found Parameters."); } try { foreach (var equip in equipments) { var originHistory = db.FmsEquipmentHistory .Where(fe => fe.SiteId == siteId && fe.EquipmentId == equip.EquipmentId) .OrderByDescending(fe => fe.EquipmentHistoryId) .Take(1).FirstOrDefault(); if (originHistory == null) { return BadRequest("Not Found Stored Info."); } FmsEquipmentHistory targetHistory = new FmsEquipmentHistory() { AddDate = DateTime.Now, CurrentStockCount = originHistory.CurrentStockCount - equip.CurrentRentCount, EquipmentId = originHistory.EquipmentId, EquipmentRentId = equipmentRentId, EquipmentStateTypeId = equip.EquipmentStateTypeId, LossCount = 0, RentCount = equip.CurrentRentCount, // 신규추가인 경우 CurrentRentCount = equip.CurrentRentCount, ReturnCount = 0, SiteId = siteId, StoredCount = 0, TotalStockCount = originHistory.TotalStockCount, UpdateDate = DateTime.Now, IsReturned = false }; db.FmsEquipmentHistory.Add(targetHistory); } db.SaveChanges(); } catch (DbUpdateException e) { throw e; } return StatusCode(HttpStatusCode.NoContent); } [ResponseType(typeof(void))] [ActionName("UpdateEquipments")] public IHttpActionResult PostFmsEquipmentRentInfoEquipments(List equipments) { if (!ModelState.IsValid) { return BadRequest(ModelState); } Uri uri = Request.RequestUri; var uriQuery = HttpUtility.ParseQueryString(uri.Query); int siteId, equipmentRentId; if (int.TryParse(uriQuery.Get("SiteId"), out siteId) == false || int.TryParse(uriQuery.Get("EquipmentRentId"), out equipmentRentId) == false) { return BadRequest("Not Found Parameters."); } // 불출내역에 포함된 공기구 리스트 var originHistoryList = db.FmsEquipmentHistory.Where(fe => fe.SiteId == siteId && fe.EquipmentRentId == equipmentRentId) .OrderByDescending(fe => fe.EquipmentHistoryId) .ToList(); try { foreach (var equip in equipments) { var originHistory = originHistoryList.Where(h => h.SiteId == siteId && h.EquipmentId == equip.EquipmentId) .FirstOrDefault(); if (originHistory == null) { // 이전 정보가 없는 경우 신규 저장 var lastestHistory = db.FmsEquipmentHistory .Where(fe => fe.EquipmentId == equip.EquipmentId) .OrderByDescending(fe => fe.EquipmentHistoryId) .Take(1).FirstOrDefault(); FmsEquipmentHistory targetHistory = new FmsEquipmentHistory() { AddDate = DateTime.Now, CurrentStockCount = lastestHistory.CurrentStockCount - equip.RentCount, EquipmentId = lastestHistory.EquipmentId, EquipmentRentId = equipmentRentId, EquipmentStateTypeId = equip.EquipmentStateTypeId, LossCount = 0, RentCount = equip.RentCount, CurrentRentCount = equip.RentCount, ReturnCount = 0, SiteId = siteId, StoredCount = 0, TotalStockCount = lastestHistory.TotalStockCount, UpdateDate = DateTime.Now, IsReturned = false, }; db.FmsEquipmentHistory.Add(targetHistory); } else { if (originHistory.CurrentRentCount != equip.CurrentRentCount) { // 현재 넘어온 값과 원래 데이터를 비교 하여 재고량을 다시 계산 if (originHistory.CurrentRentCount > equip.CurrentRentCount) { originHistory.CurrentStockCount += (originHistory.CurrentRentCount - equip.CurrentRentCount); } else if (originHistory.CurrentRentCount < equip.CurrentRentCount) { originHistory.CurrentStockCount -= (equip.CurrentRentCount - originHistory.CurrentRentCount); } originHistory.CurrentRentCount = equip.CurrentRentCount; originHistory.UpdateDate = DateTime.Now; } } } // 이전 정보 수가 현재 정보 수 보다 많은 경우, 공기구를 삭제하였을 경우 if (originHistoryList.Count > equipments.Count) { List originEquipIdList = originHistoryList.Select(e => e.EquipmentId).ToList(); List targetEquipIdList = equipments.Select(e => e.EquipmentId).ToList(); List deleteTargetEquipIdList = originEquipIdList.Except(targetEquipIdList).ToList(); foreach (var equipId in deleteTargetEquipIdList) { var deleteTarget = originHistoryList.Where(h => h.SiteId == siteId && h.EquipmentId == equipId) .FirstOrDefault(); db.FmsEquipmentHistory.Remove(deleteTarget); } } db.SaveChanges(); } catch (DbUpdateException e) { throw e; } return StatusCode(HttpStatusCode.NoContent); } protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } } public class RentEquipment { public int SiteId { get; set; } public int EquipmentId { get; set; } public int RentCount { get; set; } public int CurrentRentCount { get; set; } public int ReturnCount { get; set; } public int LossCount { get; set; } public int StoredCount { get; set; } public int EquipmentRentId { get; set; } public short EquipmentStateTypeId { get; set; } } public class UpdateRentEquipment : RentEquipment { } }