From 37e00896240e657258bc0dd712fc4a927e74b304 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Tue, 6 Jul 2021 15:47:57 +0000 Subject: [PATCH] --- .vscode/launch.json | 2 +- server/AyaNova/Controllers/UnitController.cs | 70 ++++++++++++++------ 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index fcc80a75..b77f3b95 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -53,7 +53,7 @@ "AYANOVA_FOLDER_USER_FILES": "c:\\temp\\RavenTestData\\userfiles", "AYANOVA_FOLDER_BACKUP_FILES": "c:\\temp\\RavenTestData\\backupfiles", "AYANOVA_FOLDER_TEMPORARY_SERVER_FILES": "c:\\temp\\RavenTestData\\tempfiles", - "AYANOVA_SERVER_TEST_MODE": "true", + "AYANOVA_SERVER_TEST_MODE": "false", "AYANOVA_SERVER_TEST_MODE_SEEDLEVEL": "small", "AYANOVA_SERVER_TEST_MODE_TZ_OFFSET": "-7", "AYANOVA_BACKUP_PG_DUMP_PATH": "C:\\data\\code\\postgres_13\\bin\\" diff --git a/server/AyaNova/Controllers/UnitController.cs b/server/AyaNova/Controllers/UnitController.cs index af585ea6..de0abb71 100644 --- a/server/AyaNova/Controllers/UnitController.cs +++ b/server/AyaNova/Controllers/UnitController.cs @@ -10,6 +10,7 @@ using AyaNova.Models; using AyaNova.Api.ControllerHelpers; using AyaNova.Biz; using System.Collections.Generic; +using System.Text; namespace AyaNova.Api.Controllers { @@ -182,7 +183,7 @@ namespace AyaNova.Api.Controllers /// /// List of units [HttpPost("bulk-add-selection-list")] - public async Task GetPartSerials([FromBody] UnitListByTagParams searchParam) + public async Task GetBulkAddList([FromBody] UnitListByTagParams searchParam) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); @@ -192,34 +193,65 @@ namespace AyaNova.Api.Controllers if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); - if (searchParam.restrictToCustomerId == null || searchParam.restrictToCustomerId == 0) - { - //any customer - //https://www.npgsql.org/efcore/mapping/array.html#operation-translation - //array1.All(i => array2.Contains(i)) + List ret = new List(); - // var right = contextMock.Where(x => (new List { "harry potter", "the lord of the rings" }).Any(y => x.Title.ToLower().Contains(y.ToLower()))).ToList(); + //build query + //select id,serial,customerid from aunit where aunit.tags @> array['red','blue'::varchar(255)] AND customerid=19 + /* + select aunit.id,aunit.serial, acustomer.name from aunit + left join acustomer on aunit.customerid=acustomer.id + where aunit.tags @> array['red','blue'::varchar(255)] AND customerid=19 + */ + StringBuilder sbQuery = new StringBuilder(); + sbQuery.Append("select aunit.id,aunit.serial, acustomer.name from aunit left join acustomer on aunit.customerid=acustomer.id where aunit.tags "); + StringBuilder sb = new StringBuilder(); + sb.Append("@> array["); + foreach (string s in searchParam.tags) + sb.Append($"'{s}',"); + sbQuery.Append(sb.ToString().TrimEnd(',')); + sbQuery.Append("::varchar(255)]"); - var ret = await ct.Unit.AsNoTracking().Where(z => searchParam.tags.All(y => (z.Tags.Contains(y)))).Select(z => new { z.Id, z.Serial }).ToListAsync(); - return Ok(ApiOkResponse.Response(ret)); - } - else + if (searchParam.restrictToCustomerId != null && searchParam.restrictToCustomerId != 0) + sbQuery.Append($" and customerid={searchParam.restrictToCustomerId}"); + + + + // else + // { + // //include customer + // //select id,serial,customerid from aunit where aunit.tags @> array['red','blue'::varchar(255)] AND customerid=19 + // var unitz = await ct.Unit.AsNoTracking().Where(z => z.Active == true).Where(z => searchParam.tags.All(y => (z.Tags.Contains(y)))).Select(z => new { z.CustomerId, z.Serial }).ToListAsync(); + // foreach (var u in unitz) + // { + // var cviz = await ct.Customer.AsNoTracking().Where(z => z.Id == u.CustomerId).Select(z => z.Name).FirstOrDefaultAsync(); + // ret.Add(new NameIdItem { Name = $"{cviz} - {u.Serial}" }); + + // } + // return Ok(ApiOkResponse.Response(ret.OrderBy(z => z.Name))); + // } + + List slist = new List(); + using (var cmd = ct.Database.GetDbConnection().CreateCommand()) { - //include customer - List retList = new List(); - var unitz = await ct.Unit.AsNoTracking().Where(z => z.Active == true).Where(z => searchParam.tags.All(y => (z.Tags.Contains(y)))).Select(z => new { z.CustomerId, z.Serial }).ToListAsync(); - foreach (var u in unitz) + await ct.Database.OpenConnectionAsync(); + cmd.CommandText = sbQuery.ToString(); + using (var dr = await cmd.ExecuteReaderAsync()) { - var cviz = await ct.Customer.AsNoTracking().Where(z => z.Id == u.CustomerId).Select(z => z.Name).FirstOrDefaultAsync(); - retList.Add(new NameIdItem { Name = $"{cviz} - {u.Serial}") - + while (dr.Read()) + { + slist.Add(new InternalUnitListForSorting( dr.GetString(2), dr.GetString(1) , dr.GetInt64(0))); + } } - return Ok(ApiOkResponse.Response(o)); } + var sorted=slist.OrderBy(z=>z.customername).ThenBy(z=>z.serial); +ret.AddRange(sorted.Select(z=>new NameIdItem{Id=z.unitid, Name=$"{z.serial} - {z.customername}"}).ToList()); + return Ok(ApiOkResponse.Response(ret.OrderBy(z => z.Name))); } public record UnitListByTagParams(List tags, long? restrictToCustomerId); + private record InternalUnitListForSorting(string customername, string serial, long unitid); + // public record UnitListByTagParams(char[,] tags, long? restrictToCustomerId); //------------