RecargasController.cs 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.AspNetCore.Http;
  6. using Microsoft.AspNetCore.Mvc;
  7. using Microsoft.EntityFrameworkCore;
  8. using WebApplication3.Models;
  9. using WebApplication3.Clases;
  10. namespace WebApplication3.Controllers
  11. {
  12. [Route("api/[controller]")]
  13. [ApiController]
  14. public class RecargasController : ControllerBase
  15. {
  16. private readonly AquiferContext _context;
  17. private TsRecargaController tsRecargaController;
  18. //private AcuiferoController aquiferController;
  19. public RecargasController(AquiferContext context)
  20. {
  21. _context = context;
  22. tsRecargaController = new TsRecargaController(context);
  23. //aquiferController = new AcuiferoController(context);
  24. }
  25. // GET: api/Recargas
  26. [HttpGet]
  27. public async Task<ActionResult<IEnumerable<DatosPozoRecarga>>> GetRecargas()
  28. {
  29. var recargas = await _context.Recargas.ToListAsync();
  30. List<DatosPozoRecarga> result = new();
  31. foreach(Recarga r in recargas)
  32. {
  33. DatosPozoRecarga datosRecarga = new();
  34. datosRecarga.Id = r.Id;
  35. datosRecarga.Nombre = r.Nombre;
  36. datosRecarga.Latitud = r.Latitud;
  37. datosRecarga.Longitud = r.Longitud;
  38. datosRecarga.Simulacion = r.IdSimulacion;
  39. datosRecarga.Ts = tsRecargaController.GetTsRecarga(r.Id);
  40. result.Add(datosRecarga);
  41. }
  42. return result;
  43. }
  44. // GET: api/Recargas/5
  45. [HttpGet("{id}")]
  46. [ProducesResponseType(200)]
  47. [ProducesResponseType(404)]
  48. public async Task<ActionResult<DatosPozoRecarga>> GetRecarga(uint id)
  49. {
  50. var recarga = await _context.Recargas.FindAsync(id);
  51. if (recarga == null)
  52. {
  53. return NotFound();
  54. }
  55. DatosPozoRecarga datosRecarga = new DatosPozoRecarga();
  56. datosRecarga.Id = recarga.Id;
  57. datosRecarga.Nombre = recarga.Nombre;
  58. datosRecarga.Latitud = recarga.Latitud;
  59. datosRecarga.Longitud = recarga.Longitud;
  60. datosRecarga.Simulacion = recarga.IdSimulacion;
  61. datosRecarga.Ts = tsRecargaController.GetTsRecarga(id);
  62. return datosRecarga;
  63. }
  64. // PUT: api/Recargas/5
  65. [HttpPut("{id}")]
  66. [ProducesResponseType(201)]
  67. [ProducesResponseType(400)]
  68. [ProducesResponseType(404)]
  69. public async Task<IActionResult> PutRecarga(uint id, [FromBody] DatosPozoRecarga datos)
  70. {
  71. Recarga recarga = _context.Recargas.Find(id);
  72. if (id != recarga.Id)
  73. {
  74. return BadRequest();
  75. }
  76. recarga.IdSimulacion = (datos.Simulacion != null && recarga.IdSimulacion != datos.Simulacion) ? datos.Simulacion : recarga.IdSimulacion;
  77. recarga.Latitud = (datos.Latitud != null && recarga.Latitud != datos.Latitud) ? datos.Latitud : recarga.Latitud;
  78. recarga.Longitud = (datos.Longitud != null && recarga.Longitud != datos.Longitud) ? datos.Longitud : recarga.Longitud;
  79. recarga.Nombre = (datos.Nombre != null && recarga.Nombre != datos.Nombre) ? datos.Nombre : recarga.Nombre;
  80. //Para editar los datos de la TimeSerie haria falta un identificador más
  81. _context.Entry(recarga).State = EntityState.Modified;
  82. try
  83. {
  84. await _context.SaveChangesAsync();
  85. }
  86. catch (DbUpdateConcurrencyException)
  87. {
  88. if (!RecargaExists((uint)id))
  89. {
  90. return NotFound();
  91. }
  92. else
  93. {
  94. throw;
  95. }
  96. }
  97. return CreatedAtAction("GetRecarga", new { id = recarga.Id }, recarga);
  98. }
  99. // POST: api/Recargas
  100. [HttpPost]
  101. [ProducesResponseType(201)]
  102. [ProducesResponseType(409)]
  103. public async Task<ActionResult<Recarga>> PostRecarga([FromBody] DatosPozoRecarga datos)
  104. {
  105. Recarga recarga = new Recarga();
  106. recarga.IdSimulacion = datos.Simulacion;
  107. recarga.Nombre = datos.Nombre;
  108. recarga.Latitud = datos.Latitud;
  109. recarga.Longitud = datos.Longitud;
  110. recarga.IdAcuifero = datos.Acuifero;
  111. _context.Recargas.Add(recarga);
  112. try
  113. {
  114. await _context.SaveChangesAsync();
  115. foreach(TimeSerie ts in datos.Ts)
  116. {
  117. TsRecarga tsRecarga = new TsRecarga();
  118. tsRecarga.IdRecarga = recarga.Id;
  119. tsRecarga.MarcaTiempo = ts.Hora;
  120. tsRecarga.Valor = ts.Valor;
  121. await tsRecargaController.PostTsRecarga(tsRecarga);
  122. }
  123. }
  124. catch (DbUpdateException)
  125. {
  126. if (RecargaExists(recarga.Id))
  127. {
  128. return Conflict();
  129. }
  130. else
  131. {
  132. throw;
  133. }
  134. }
  135. return CreatedAtAction("GetRecarga", new { id = recarga.Id }, recarga);
  136. }
  137. // DELETE: api/Recargas/5
  138. [HttpDelete("{id}")]
  139. public async Task<IActionResult> DeleteRecarga(uint id)
  140. {
  141. var recarga = await _context.Recargas.FindAsync(id);
  142. if (recarga == null)
  143. {
  144. return NotFound();
  145. }
  146. _context.Recargas.Remove(recarga);
  147. await _context.SaveChangesAsync();
  148. return NoContent();
  149. }
  150. private bool RecargaExists(uint id)
  151. {
  152. return _context.Recargas.Any(e => e.Id == id);
  153. }
  154. [NonAction]
  155. public async void SetRecargasSimulacion(uint? acuiferoId, uint? simulacionId)
  156. {
  157. Recarga[] recargas = _context.Recargas.Where(x => x.IdAcuifero == acuiferoId && x.IdSimulacion == null).ToArray<Recarga>();
  158. foreach (Recarga r in recargas)
  159. {
  160. Recarga recarga = r.Copy(simulacionId);
  161. _context.Recargas.Add(recarga);
  162. }
  163. await _context.SaveChangesAsync();
  164. }
  165. [NonAction]
  166. public List<Recarga> GetRecargasSimulacion(uint? simulacionId)
  167. {
  168. List<Recarga> recargas = _context.Recargas.Where(x => x.IdSimulacion == simulacionId).ToList<Recarga>();
  169. return recargas;
  170. }
  171. [NonAction]
  172. public Recarga[] GetRecargasAcuifero(uint acuiferoId)
  173. {
  174. return _context.Recargas.Where(x => x.IdAcuifero == acuiferoId).ToArray<Recarga>();
  175. }
  176. [NonAction]
  177. public Recarga[] GetRecargasAcuiferoSimulacionInicial(uint acuiferoId)
  178. {
  179. return _context.Recargas.Where(x => x.IdAcuifero == acuiferoId && x.IdSimulacion == null).ToArray<Recarga>();
  180. }
  181. [NonAction]
  182. public List<TsRecarga> GetTsRecargaFromRecaga(uint? recarga)
  183. {
  184. List<TsRecarga> tsRecarga = _context.TsRecargas.Where(x => x.IdRecarga == recarga).ToList<TsRecarga>();
  185. return tsRecarga;
  186. }
  187. [NonAction]
  188. public async Task<ActionResult<IEnumerable<Recarga>>> ParseoFichero(uint aquifer, string file, uint simId)
  189. {
  190. Parser parser = new Parser();
  191. //string file = @"C:\Users\Admin\Desktop\ASD\infoPozos.VMW";
  192. RechargeData[] recharges = parser.ParseRechargeData(file, out string recharge_geometry);
  193. await SetRechargeGeometry(aquifer, recharge_geometry);
  194. string fileName = Utilities.String2Png(recharge_geometry);
  195. Byte[] bytes = System.IO.File.ReadAllBytes(fileName);
  196. String base64Image = Convert.ToBase64String(bytes);
  197. await SetRechargeMapColor(aquifer, base64Image);
  198. return await PostMultipleRecharges(aquifer,recharges,simId);
  199. }
  200. [NonAction]
  201. public async Task<Acuifero> SetRechargeGeometry(uint id, string recharge_geometry)
  202. {
  203. Acuifero aquifer = _context.Acuiferos.Find(id);
  204. aquifer.RechargeGeometry = recharge_geometry;
  205. _context.Entry(aquifer).State = EntityState.Modified;
  206. try
  207. {
  208. await _context.SaveChangesAsync();
  209. }
  210. catch (DbUpdateConcurrencyException)
  211. {
  212. if (!AcuiferoExists(id))
  213. {
  214. return null;
  215. }
  216. else
  217. {
  218. throw;
  219. }
  220. }
  221. return aquifer;
  222. }
  223. [NonAction]
  224. public async Task<bool> SetRechargeMapColor(uint id, string base64)
  225. {
  226. Acuifero aquifer = _context.Acuiferos.Find(id);
  227. aquifer.RechargeColorMap = base64;
  228. _context.Entry(aquifer).State = EntityState.Modified;
  229. try
  230. {
  231. await _context.SaveChangesAsync();
  232. }
  233. catch (DbUpdateConcurrencyException)
  234. {
  235. if (!AcuiferoExists(id))
  236. {
  237. return false;
  238. }
  239. else
  240. {
  241. throw;
  242. }
  243. }
  244. return true;
  245. }
  246. private bool AcuiferoExists(uint id)
  247. {
  248. return _context.Acuiferos.Any(e => e.Id == id);
  249. }
  250. [NonAction]
  251. public async Task<ActionResult<IEnumerable<Recarga>>> PostMultipleRecharges(uint aquifer, RechargeData[] recharges, uint simId)
  252. {
  253. foreach (RechargeData r in recharges)
  254. {
  255. Recarga recarga = r.ToRecarga(aquifer,simId);
  256. _context.Recargas.Add(recarga);
  257. try
  258. {
  259. await _context.SaveChangesAsync();
  260. foreach (TimeSerieInterno ts in r.Rates)
  261. {
  262. TsRecarga tsRecarga = new();
  263. tsRecarga.IdRecarga = recarga.Id;
  264. tsRecarga.MarcaTiempo = ts.Hora;
  265. tsRecarga.MarcaTiempoEnd = ts.HoraEnd;
  266. tsRecarga.Valor = ts.Valor;
  267. await tsRecargaController.PostTsRecarga(tsRecarga);
  268. }
  269. }
  270. catch (DbUpdateException)
  271. {
  272. if (RecargaExists(recarga.Id))
  273. {
  274. return Conflict();
  275. }
  276. else
  277. {
  278. throw;
  279. }
  280. }
  281. }
  282. return await _context.Recargas.ToListAsync();
  283. }
  284. }
  285. }