修改测试查询的界面部分逻辑,修复bug

This commit is contained in:
2026-01-13 10:55:29 +08:00
parent b9b1ff5ed4
commit 28ae23cdf3
14 changed files with 319 additions and 126 deletions

View File

@@ -113,6 +113,7 @@ namespace WebAPIServer.Controllers
entity = q.TblUtsManageUsers.SingleOrDefault(A => A.UserName.Equals(username) && A.Password.Equals(pwd));
if (entity != null)
{
var auths = q.TblUtsManageUserauthOperations.Where(A => A.UserId == entity.Id).ToList();
TokenString = GetToken(entity);
res.isok = true;
@@ -123,6 +124,7 @@ namespace WebAPIServer.Controllers
r.IsAdmin = entity.IsAdmin;
r.ID = entity.Id;
r.UserName = entity.UserName;
r.Auths = auths;
res.response = r;
}
else

View File

@@ -197,7 +197,8 @@ namespace WebAPIServer.Controllers
IDbCommand dataCmd = conn.CreateCommand();
dataCmd.CommandText = dataQuery.ToString();
MySqlCommand command = dataCmd as MySqlCommand;
var command = dataCmd as MySqlCommand
?? throw new InvalidOperationException("Database command is not MySqlCommand");
MySqlDataAdapter adapter = new(command);
DataSet ds = new();
adapter.Fill(ds);
@@ -239,11 +240,57 @@ namespace WebAPIServer.Controllers
string? EndTime = T.EndTime;
string? TestResult = T.TestResult;
List<string>? FailSteps = T.FailSteps;
string? dutSnLike = T.DutSnLike;
string? failstepsLike = T.FailstepsLike;
string? ColumnList = T.ColumnList;
int page = T.Page;
int pageSize = T.PageSize;
string distinctType = T.DistinctType ?? "None"; // 获取去重类型,默认为不去重
static List<string> SplitCommaTokens(string? input)
{
if (string.IsNullOrWhiteSpace(input))
{
return [];
}
return input
.Split(',', StringSplitOptions.RemoveEmptyEntries)
.Select(s => s.Trim())
.Where(s => !string.IsNullOrWhiteSpace(s))
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
}
static void AppendLikeOrClause(StringBuilder sb, IDbCommand cmd, string fieldName, string paramPrefix, List<string> tokens)
{
if (tokens == null || tokens.Count == 0)
{
return;
}
sb.Append("AND (");
for (int i = 0; i < tokens.Count; i++)
{
if (i > 0)
{
sb.Append(" OR ");
}
string paramName = $"@{paramPrefix}{i}";
sb.Append($"{fieldName} LIKE {paramName} ");
var p = cmd.CreateParameter();
p.ParameterName = paramName;
p.Value = $"%{tokens[i]}%";
cmd.Parameters.Add(p);
}
sb.Append(") ");
}
var dutSnTokens = SplitCommaTokens(dutSnLike);
var failstepsTokens = SplitCommaTokens(failstepsLike);
if (string.IsNullOrEmpty(StartTime) || string.IsNullOrEmpty(EndTime))
{
returnInfo.isok = false;
@@ -265,6 +312,8 @@ namespace WebAPIServer.Controllers
// 1. 构建基础查询(总数查询)
StringBuilder baseQuery = new StringBuilder();
IDbCommand countCmd = conn.CreateCommand();
if (distinctType == "None")
{
// 不去重的情况
@@ -290,8 +339,10 @@ namespace WebAPIServer.Controllers
baseQuery.Append($"AND Failsteps IN ({failStepsCondition}) ");
}
AppendLikeOrClause(baseQuery, countCmd, "DUT_SN", "sn", dutSnTokens);
AppendLikeOrClause(baseQuery, countCmd, "Failsteps", "fs", failstepsTokens);
// 执行总数查询
IDbCommand countCmd = conn.CreateCommand();
countCmd.CommandText = baseQuery.ToString();
long totalCount = Convert.ToInt64(countCmd.ExecuteScalar());
@@ -299,6 +350,8 @@ namespace WebAPIServer.Controllers
long totalPassCount = 0;
StringBuilder totalPassQuery = new StringBuilder();
IDbCommand totalPassCmd = conn.CreateCommand();
if (distinctType == "None")
{
// 不去重的情况:统计所有通过的记录
@@ -317,6 +370,9 @@ namespace WebAPIServer.Controllers
string failStepsCondition = string.Join(",", FailSteps.Select(f => $"'{MySqlHelper.EscapeString(f)}'"));
totalPassQuery.Append($"AND Failsteps IN ({failStepsCondition}) ");
}
AppendLikeOrClause(totalPassQuery, totalPassCmd, "DUT_SN", "sn", dutSnTokens);
AppendLikeOrClause(totalPassQuery, totalPassCmd, "Failsteps", "fs", failstepsTokens);
}
else
{
@@ -340,10 +396,11 @@ namespace WebAPIServer.Controllers
totalPassQuery.Append($"AND Failsteps IN ({failStepsCondition}) ");
}
AppendLikeOrClause(totalPassQuery, totalPassCmd, "DUT_SN", "sn", dutSnTokens);
AppendLikeOrClause(totalPassQuery, totalPassCmd, "Failsteps", "fs", failstepsTokens);
totalPassQuery.Append($") as t WHERE rn = 1 AND TestResult = '1'");
}
IDbCommand totalPassCmd = conn.CreateCommand();
totalPassCmd.CommandText = totalPassQuery.ToString();
totalPassCount = Convert.ToInt64(totalPassCmd.ExecuteScalar());
@@ -352,6 +409,8 @@ namespace WebAPIServer.Controllers
// 4. 构建数据查询
StringBuilder dataQuery = new StringBuilder();
IDbCommand dataCmd = conn.CreateCommand();
if (distinctType == "None")
{
// 不去重的情况
@@ -395,6 +454,9 @@ namespace WebAPIServer.Controllers
dataQuery.Append($"AND Failsteps IN ({failStepsCondition}) ");
}
AppendLikeOrClause(dataQuery, dataCmd, "DUT_SN", "sn", dutSnTokens);
AppendLikeOrClause(dataQuery, dataCmd, "Failsteps", "fs", failstepsTokens);
dataQuery.Append(") t WHERE rn = 1 ");
}
@@ -412,16 +474,19 @@ namespace WebAPIServer.Controllers
string failStepsCondition = string.Join(",", FailSteps.Select(f => $"'{MySqlHelper.EscapeString(f)}'"));
dataQuery.Append($"AND Failsteps IN ({failStepsCondition}) ");
}
AppendLikeOrClause(dataQuery, dataCmd, "DUT_SN", "sn", dutSnTokens);
AppendLikeOrClause(dataQuery, dataCmd, "Failsteps", "fs", failstepsTokens);
}
// 添加排序和分页
dataQuery.Append($"ORDER BY StartTime DESC LIMIT {pageSize} OFFSET {(page - 1) * pageSize}");
// 执行数据查询
IDbCommand dataCmd = conn.CreateCommand();
dataCmd.CommandText = dataQuery.ToString();
MySqlCommand command = dataCmd as MySqlCommand;
var command = dataCmd as MySqlCommand
?? throw new InvalidOperationException("Database command is not MySqlCommand");
MySqlDataAdapter adapter = new(command);
DataSet ds = new();
adapter.Fill(ds);
@@ -461,10 +526,12 @@ namespace WebAPIServer.Controllers
{
public string? dbName { get; set; }
public string? tbName { get; set; }
public string StartTime { get; set; }
public string EndTime { get; set; }
public string StartTime { get; set; } = string.Empty;
public string EndTime { get; set; } = string.Empty;
public string? TestResult { get; set; }
public List<string>? FailSteps { get; set; }
public string? DutSnLike { get; set; }
public string? FailstepsLike { get; set; }
public string? ColumnList { get; set; }
public string DistinctType { get; set; } = "None"; // 新增字段None-不去重, Latest-保留最新, Earliest-保留最早
}
@@ -472,27 +539,27 @@ namespace WebAPIServer.Controllers
public class ReturnTestLogs
{
public string Step { get; set; }
public string ID { get; set; }
public string StartTime { get; set; }
public string UsedTime { get; set; }
public string FailSteps { get; set; }
public string FailMsg { get; set; }
public string TestResult { get; set; }
public List<Dictionary<string, string>> RObj { get; set; }
public string Step { get; set; } = string.Empty;
public string ID { get; set; } = string.Empty;
public string StartTime { get; set; } = string.Empty;
public string UsedTime { get; set; } = string.Empty;
public string FailSteps { get; set; } = string.Empty;
public string FailMsg { get; set; } = string.Empty;
public string TestResult { get; set; } = string.Empty;
public List<Dictionary<string, string>> RObj { get; set; } = new();
}
public class TestLogsQueryModel
{
public string DBName { get; set; }
public string SnCode { get; set; }
public string DBName { get; set; } = string.Empty;
public string SnCode { get; set; } = string.Empty;
public List<DBL> DbList { get; set; }
public List<DBL> DbList { get; set; } = new();
}
public class DBL
{
public string ProId { get; set; }
public string Step { get; set; }
public string ProId { get; set; } = string.Empty;
public string Step { get; set; } = string.Empty;
}
@@ -506,9 +573,9 @@ namespace WebAPIServer.Controllers
public class ReturnInfoPage
{
public bool isok { get; set; }
public string message { get; set; }
public string? message { get; set; }
public long total { get; set; }
public object response { get; set; }
public object? response { get; set; }
public long passCount { get; set; }
public double passRate { get; set; }
}