初始化

This commit is contained in:
2025-11-20 14:07:55 +08:00
commit b9b1ff5ed4
318 changed files with 42662 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using ViewModels;
using WebAPIServer.Models;
namespace WebAPIServer.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class CompanyController : ControllerBase
{
[HttpPost()]
[Authorize()]
public ReturnInfo GetCompanyInfo([FromBody] QueryAll_Or_Single S)
{
ReturnInfo returnInfo = new ReturnInfo();
try
{
using (var q=new UtsManageContext())
{
if (S.IsAll)
{
returnInfo.isok = true;
returnInfo.response = q.TblUtsManageCompanies.ToList();
}
else
{
returnInfo.isok = true;
var a = q.TblUtsManageUsers.SingleOrDefault(A => A.Id == S.ID);
if (a != null)
{
returnInfo.response = a;
}
}
}
}
catch (Exception ex)
{
returnInfo.isok = false;
returnInfo.message = ex.Message;
}
return returnInfo;
}
}
}

View File

@@ -0,0 +1,275 @@
using ClosedXML.Excel;
using IronPython.Hosting;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Query.Internal;
using Microsoft.Extensions.Caching.Memory;
using MySqlConnector;
using NLog;
using System.Data;
using System.Text;
using ViewModels;
using WebAPIServer.Common;
using WebAPIServer.Models;
namespace WebAPIServer.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class DataHandleController : ControllerBase
{
private readonly Logger _logger = LogManager.GetCurrentClassLogger();
public readonly IMemoryCache _memoryCache;
public DataHandleController(IMemoryCache memoryCache)
{
this._memoryCache = memoryCache;
}
[HttpPost()]
public string NNN()
{
return "hello";
}
[HttpPost()]
[Authorize()]
public ReturnInfo R_InfoCommon([FromBody] PageQueryData S)
{
ReturnInfo returnInfo = new ReturnInfo();
try
{
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
string KKK = "";
if (S.DBQueryData.Count > 0)
{
KKK = string.Join('_', S.DBQueryData);
}
string NK = S.Key + S.CmdType??"" + KKK;
var ooo = _memoryCache.Get<List<Dictionary<string, object>>>(NK);
if (ooo != null)
{
list = ooo;
}
else
{
using (var q = new UtsManageContext())
{
using IDbConnection conn = q.Database.GetDbConnection();
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
IDbCommand cmd = conn.CreateCommand();
string VariableName = S.Key;
string result = "";
if (S.isFunction)
{
if (S.FunParameters.Count == 1)
{
result = StaticData.scope.GetVariable(VariableName)(S.FunParameters[0]);
}
if (S.FunParameters.Count == 2)
{
result = StaticData.scope.GetVariable(VariableName)(S.FunParameters[0], S.FunParameters[1]);
}
if (S.FunParameters.Count == 3)
{
result = StaticData.scope.GetVariable(VariableName)(S.FunParameters[0], S.FunParameters[1], S.FunParameters[2]);
}
if (S.FunParameters.Count == 4)
{
result = StaticData.scope.GetVariable(VariableName)(S.FunParameters[0], S.FunParameters[1], S.FunParameters[2], S.FunParameters[3]);
}
if (S.FunParameters.Count == 5)
{
result = StaticData.scope.GetVariable(VariableName)(S.FunParameters[0], S.FunParameters[1], S.FunParameters[2], S.FunParameters[3], S.FunParameters[4]);
}
}
else
{
result = StaticData.scope.GetVariable(VariableName);
}
var Q = S.DBQueryData;
if (S.CmdType.Equals("sys"))
{
foreach (var item in Q)
{
result = result.Replace(item.Key, item.Value);
}
}
else
{
foreach (QueryString item in Q)
{
if (item.ValueType.Equals("string"))
{
MySqlParameter mmm = new MySqlParameter(item.Key, item.Value);
cmd.Parameters.Add(mmm);
}
else if (item.ValueType.Equals("number"))
{
decimal a = 0;
decimal.TryParse(item.Value, out a);
MySqlParameter mmm = new MySqlParameter(item.Key, a);
cmd.Parameters.Add(mmm);
}
}
}
cmd.CommandText = result;
cmd.CommandType = CommandType.Text;
MySqlCommand command = cmd as MySqlCommand;
MySqlDataAdapter adapter = new MySqlDataAdapter(command);
DataSet ds = new DataSet();
adapter.Fill(ds);
DataTable dt = ds.Tables[0];
//string str= System.Text.Json.JsonSerializer.Serialize(dt);
foreach (DataRow item in dt.Rows)
{
Dictionary<string, object> dic = new Dictionary<string, object>();
foreach (DataColumn item1 in dt.Columns)
{
string CName = item1.ColumnName;
dic.Add(CName, item[CName]);
}
list.Add(dic);
}
}
}
returnInfo.isok = true;
returnInfo.response = list;
}
catch (Exception ex)
{
returnInfo.isok = false;
returnInfo.message = ex.Message;
}
return returnInfo;
}
[HttpPost()]
[Authorize()]
public ReturnInfo CUD_InfoCommon([FromBody] PageQueryData S)
{
ReturnInfo returnInfo = new ReturnInfo();
try
{
using (var q = new UtsManageContext())
{
using IDbConnection conn = q.Database.GetDbConnection();
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
IDbCommand cmd = conn.CreateCommand();
string VariableName = S.Key;
string result = "";
if (S.isFunction)
{
var LG = S.FunParameters;
result = StaticData.scope.GetVariable(VariableName)(S.FunParameters);
}
else
{
result = StaticData.scope.GetVariable(VariableName);
}
var Q = S.DBQueryData;
if (S.CmdType.Equals("sys"))
{
foreach (var item in Q)
{
result = result.Replace(item.Key, item.Value);
}
}
else
{
foreach (QueryString item in Q)
{
if (item.ValueType.Equals("string"))
{
MySqlParameter mmm = new MySqlParameter(item.Key, item.Value);
cmd.Parameters.Add(mmm);
}
else if (item.ValueType.Equals("number"))
{
decimal a = 0;
decimal.TryParse(item.Value, out a);
MySqlParameter mmm = new MySqlParameter(item.Key, a);
cmd.Parameters.Add(mmm);
}
}
}
cmd.CommandText = result;
cmd.CommandType = CommandType.Text;
object ooo = cmd.ExecuteNonQuery();
returnInfo.response = ooo;
returnInfo.isok = true;
}
}
catch (Exception ex)
{
returnInfo.isok = false;
returnInfo.message = ex.Message;
}
return returnInfo;
}
[HttpPost()]
public ReturnInfo III([FromBody] PageQueryData S)
{
var NNN = S.FunParameters;
var result = StaticData.scope.GetVariable("a")(NNN);
return null;
}
}
public record PageQueryData
{
public string Key { get; set; }
public bool isFunction { get; set; } = false;
/// <summary>
/// 参数最多直接5个参数
/// </summary>
public List<string>? FunParameters { get; set; }
//sys
//customer
public string? CmdType { get; set; }
public List<QueryString>? DBQueryData { get; set; }
}
public class FunParameter
{
public string PKey { get; set; }
public string PValue { get; set; }
}
public record QueryString
{
public string Key { get; set; }
public string Value { get; set; }
public string ValueType { get; set; }
}
}

View File

@@ -0,0 +1,395 @@
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication;
using System.Security.Claims;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Logging;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Text;
using ViewModels;
using Microsoft.Extensions.Configuration;
using System;
using System.Linq;
using ViewModels.RequestData;
using ViewModels.ResponseData;
using WebAPIServer.Extensions;
using WebAPIServer.Models;
using System.Net;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using RestSharp;
using UAParser;
using UAParser.Objects;
using NLog;
namespace WebAPIServer.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class LoginController : ControllerBase
{
public IConfiguration? configuration { get; set; }
public LoginController(IConfiguration _configuration)
{
configuration = _configuration;
}
[Authorize()]
[HttpPost()]
public ReturnInfo TokenXuQi()
{
ReturnInfo r = new ReturnInfo();
r.isok = false;
try
{
var claims = HttpContext.AuthenticateAsync().Result?.Principal?.Claims;
if (claims != null && claims.Any())
{
var Name = claims.SingleOrDefault(A => A.Type == ClaimTypes.Name)?.Value;
var UUU = claims.SingleOrDefault(A => A.Type == ClaimTypes.Role)?.Value;
var TTT = claims.SingleOrDefault(A => A.Type == ClaimTypes.NameIdentifier)?.Value;
TblUtsManageUser? HH = new TblUtsManageUser();
int a = 0;
int.TryParse(TTT, out a);
HH.Id = a;
bool bl = false;
bool.TryParse(UUU, out bl);
HH.IsAdmin = bl;
HH.UserName = Name;
string TokenStr = GetToken(HH);
r.isok = true;
r.response = TokenStr;
}
}
catch (Exception ex)
{
r.isok = false;
r.message = ex.Message;
}
return r;
//var identity = HttpContext.User.Identity as ClaimsIdentity;
//if (identity != null)
//{
// var userClaims = identity.Claims;
//}
//return "hello world";
}
[HttpGet()] // 例如一个获取验证码的API端点
public IActionResult GetCaptcha()
{
string captchaText; // 这里使用上面任一版本的GenerateCaptchaImage方法生成的文本。例如captchaText = CaptchaHelperSkiaSharp.GenerateCaptchaImage(out captchaText); 或 captchaText = CaptchaHelper.GenerateCaptchaImage(out captchaText); 根据你的选择。
byte[] imageBytes = CaptchaHelperSkiaSharp.GenerateCaptchaImage(); // 或者使用System.Drawing的方法。确保你选择了
return Ok(new { CaptchaText = "1111", Image = Convert.ToBase64String(imageBytes) });
}
/// <summary>
/// 登录
/// </summary>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
/// <returns></returns>
[HttpPost]
public ReturnInfo Login([FromBody] LoginData data)
{
ReturnInfo res = new ReturnInfo();
try
{
string password = data.password;
string username = data.username;
TblUtsManageUser? entity = null;
string TokenString = "";
string pwd = password.ToMD5().ToMD5();
using (var q = new UtsManageContext())
{
entity = q.TblUtsManageUsers.SingleOrDefault(A => A.UserName.Equals(username) && A.Password.Equals(pwd));
if (entity != null)
{
TokenString = GetToken(entity);
res.isok = true;
ResLoginData r = new ResLoginData();
r.AccessToken = TokenString;
r.IsAdmin = entity.IsAdmin;
r.ID = entity.Id;
r.UserName = entity.UserName;
res.response = r;
}
else
{
res.isok = false;
res.message = "用户名或密码错误";
}
}
}
catch (Exception ex)
{
res.message = ex.Message;
res.isok = false;
}
return res;
}
private string GetToken(TblUtsManageUser? entity)
{
string TokenString;
var claims = new Claim[]
{
new Claim(ClaimTypes.NameIdentifier, entity.Id.ToString()),
new Claim(ClaimTypes.Role, entity.IsAdmin.ToString()),
new Claim(ClaimTypes.Name, entity.UserName)
};
var secretByte = Encoding.UTF8.GetBytes(configuration["JwT:SecretKey"]);
var signingKey = new SymmetricSecurityKey(secretByte);
var a = SecurityAlgorithms.HmacSha256;
var signingCredentials = new SigningCredentials(signingKey, a);
var token = new JwtSecurityToken(
issuer: configuration["JwT:Issuer"],
audience: configuration["JwT:Audience"],//接收
claims: claims,//存放的用户信息
notBefore: DateTime.UtcNow,//发布时间
expires: DateTime.UtcNow.AddDays(3),//过期时间
signingCredentials: signingCredentials
//有效期设置为1天signingCredentials //数字名
);
TokenString = new JwtSecurityTokenHandler().WriteToken(token);
return TokenString;
}
public class LLLG
{
public string UserName { get; set; }
public string Database { get; set; }
}
private readonly Logger _logger = LogManager.GetCurrentClassLogger();
[Authorize()]
[HttpPost()]
public ReturnInfo LogRecord([FromBody] LLLG data)
{
ReturnInfo res = new ReturnInfo();
try
{
string Device = "Unknown";
#region
var userAgent = Request.Headers["User-Agent"].ToString();
bool
_windows = userAgent.Contains("Windows NT"),
_mac = userAgent.Contains("Macintosh"),
_iphone = userAgent.Contains("iPhone"),
_android = userAgent.Contains("Android")
;
if (_windows)
{
Device = "windows";
}
else if (_mac)
{
Device = "Mac";
}
else if (_iphone)
{
Device = "ios";
}
else if (_android)
{
Device = "Android";
}
else
{
Device = "未知";
}
#endregion
//获得IP
string? ip = string.Empty;
string? NNN = HttpContext?.Request?.HttpContext?.Connection?.RemoteIpAddress?.ToString();
if (string.IsNullOrEmpty(NNN))
{
ip = HttpContext?.Request.Headers["HTTP_X_FORWARDED_FOR"];
}
else
{
ip = NNN;
}
var uaParser = Parser.GetDefault();
ClientInfo c = uaParser.Parse(userAgent);
using (var q = new UtsManageContext())
{
TblUtsUseroperation t = new TblUtsUseroperation();
t.CreationTime = DateTime.Now;
t.UserName = data.UserName;
t.Ip = ip;
t.Browser = c.Browser.Family + " " + c.Browser.Major + "." + c.Browser.Minor;
t.Operation = "登录";
t.Database = data.Database;
t.Device = Device;
if (ip.Equals("::1"))
{
t.Location = "本地";
}
else
{
t.Location = GetBaiduIp(ip);
}
q.TblUtsUseroperations.Add(t);
q.SaveChanges();
res.isok = true;
res.response = "sucess";
}
}
catch (Exception ex)
{
_logger.Error(ex.Message);
res.isok = false;
res.response = ex.Message;
}
return res;
}
public static void UserLog(string Openration, string Device)
{
}
[HttpPost()]
[Authorize()]
public string Helloooo()
{
return "hello";
}
[HttpGet()]
public string AccessDenied()
{
return "aaaa";
}
/// <summary>
/// 百度api
/// </summary>
/// <returns></returns>
public static string GetBaiduIp(string ip)
{
string location = "";
try
{
string url = $"https://sp0.baidu.com";
//WebClient client = new WebClient();
RestSharp.RestClient client1 = new RestSharp.RestClient(url);
RestSharp.RestRequest request = new RestSharp.RestRequest($"/8aQDcjqpAAV3otqbppnN2DJv/api.php?query={ip}&co=&resource_id=6006&oe=utf8", Method.Get);
var buffer = client1.DownloadData(request);
//var buffer = client.DownloadData(url);
string jsonText = Encoding.UTF8.GetString(buffer);
JObject jo = JObject.Parse(jsonText);
Root root = JsonConvert.DeserializeObject<Root>(jo.ToString());
foreach (var item in root.data)
{
location = item.location;
}
return location;
}
catch (Exception ex)
{
//Console.WriteLine(ex);
return location;
}
}
}
public class Root
{
public List<DataItem> data { get; set; }
}
public class DataItem
{
/// <summary>
///
/// </summary>
public string ExtendedLocation { get; set; }
/// <summary>
///
/// </summary>
public string OriginQuery { get; set; }
/// <summary>
///
/// </summary>
public string appinfo { get; set; }
/// <summary>
///
/// </summary>
public int disp_type { get; set; }
/// <summary>
///
/// </summary>
public string fetchkey { get; set; }
/// <summary>
/// 本地局域网
/// </summary>
public string location { get; set; }
/// <summary>
///
/// </summary>
public string origip { get; set; }
/// <summary>
///
/// </summary>
public string origipquery { get; set; }
/// <summary>
///
/// </summary>
public string resourceid { get; set; }
/// <summary>
///
/// </summary>
public int role_id { get; set; }
/// <summary>
///
/// </summary>
public int shareImage { get; set; }
/// <summary>
///
/// </summary>
public int showLikeShare { get; set; }
/// <summary>
///
/// </summary>
public string showlamp { get; set; }
/// <summary>
/// IP地址查询
/// </summary>
public string titlecont { get; set; }
/// <summary>
///
/// </summary>
public string tplt { get; set; }
}
}

View File

@@ -0,0 +1,515 @@
using ClosedXML.Excel;
using IronPython.Hosting;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Query.Internal;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal;
using Microsoft.IdentityModel.Tokens;
using MySqlConnector;
using NLog;
using System.Data;
using System.Text;
using ViewModels;
using WebAPIServer.Common;
using WebAPIServer.Models;
namespace WebAPIServer.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class TestLogsController : ControllerBase
{
/// <summary>
/// 每个步骤返回多条测试记录
/// </summary>
[HttpPost()]
[Authorize()]
public ReturnInfo GetLogListBySN([FromBody] TestLogsQueryModel T)
{
ReturnInfo returnInfo = new();
try
{
using (var q = new UtsManageContext())
{
using IDbConnection conn = q.Database.GetDbConnection();
conn.Open();
List<ReturnTestLogs> tl = [];
foreach (var item in T.DbList)
{
string tableName = $"{T.DBName}.tbl_{item.ProId}_{item.Step}_testlog";
// 修改点1移除了MAX聚合函数查询所有匹配记录
string sql = $"SELECT * FROM {tableName} WHERE DUT_SN = '{T.SnCode}'";
using MySqlCommand command = new(sql, (MySqlConnection)conn);
using MySqlDataAdapter adapter = new(command);
DataSet ds = new();
adapter.Fill(ds);
if (ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
{
// 没有数据时仍创建空对象(保持原有结构)
tl.Add(new ReturnTestLogs
{
Step = item.Step,
ID = "",
StartTime = "",
UsedTime = "",
FailSteps = "",
FailMsg = "",
TestResult = "",
RObj = new List<Dictionary<string, string>>()
});
}
else
{
// 修改点2处理所有行数据
foreach (DataRow row in ds.Tables[0].Rows)
{
var log = new ReturnTestLogs
{
Step = item.Step,
ID = row["ID"]?.ToString() ?? "",
StartTime = row["StartTime"]?.ToString() ?? "",
UsedTime = row["UsedTime"]?.ToString() ?? "",
FailSteps = row["FailSteps"]?.ToString() ?? "",
FailMsg = row["FailMsg"]?.ToString() ?? "",
TestResult = row["TestResult"]?.ToString() ?? "",
RObj = []
};
// 修改点3每行数据单独创建字典
var rowData = new Dictionary<string, string>();
foreach (DataColumn col in ds.Tables[0].Columns)
{
rowData[col.ColumnName] = row[col]?.ToString() ?? "";
}
log.RObj.Add(rowData);
tl.Add(log);
}
}
}
returnInfo.isok = true;
returnInfo.response = tl;
}
}
catch (Exception ex)
{
returnInfo.isok = false;
returnInfo.message = ex.Message;
}
return returnInfo;
}
/// <summary>
/// 测试总表Excel
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost()]
[Authorize()]
public IActionResult GetTestSummaryTableExcel([FromBody] TestLogExportRequest request)
{
try
{
string? dbName = request.dbName;
string? tbName = request.tbName;
string? startDate = request.StartTime;
string? endDate = request.EndTime;
string? testResult = request.TestResult;
List<string>? failSteps = request.FailSteps;
string? columnList = request.ColumnList;
string distinctType = request.DistinctType ?? "None"; // 获取去重类型
if (string.IsNullOrEmpty(startDate) || string.IsNullOrEmpty(endDate))
{
return BadRequest("开始时间或结束时间不能为空");
}
using (var q = new UtsManageContext())
{
using IDbConnection conn = q.Database.GetDbConnection();
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
// 构建查询
StringBuilder dataQuery = new StringBuilder();
if (distinctType == "None")
{
// 不去重的情况
dataQuery.Append("SELECT ID, ServiceID AS SID, StartTime, DUT_SN, TestResult, Failsteps");
if (!string.IsNullOrEmpty(columnList))
{
dataQuery.Append(columnList);
}
dataQuery.Append($" FROM {dbName}.{tbName} ");
dataQuery.Append($"WHERE StartTime BETWEEN '{startDate} 00:00:00' AND '{endDate} 23:59:59' ");
}
else
{
// 去重的情况
string orderDirection = distinctType == "Latest" ? "DESC" : "ASC";
dataQuery.Append("SELECT ID, ServiceID AS SID, StartTime, DUT_SN, TestResult, Failsteps");
if (!string.IsNullOrEmpty(columnList))
{
dataQuery.Append(columnList);
}
dataQuery.Append(" FROM (");
dataQuery.Append("SELECT *, ROW_NUMBER() OVER (PARTITION BY DUT_SN ORDER BY StartTime ");
dataQuery.Append(orderDirection);
dataQuery.Append($") AS rn FROM {dbName}.{tbName} ");
dataQuery.Append($"WHERE StartTime BETWEEN '{startDate} 00:00:00' AND '{endDate} 23:59:59' ");
}
if (!string.IsNullOrEmpty(testResult))
{
dataQuery.Append($"AND TestResult = '{testResult}' ");
}
if (failSteps != null && failSteps.Count > 0)
{
string failStepsCondition = string.Join(",", failSteps.Select(f => $"'{MySqlHelper.EscapeString(f)}'"));
dataQuery.Append($"AND Failsteps IN ({failStepsCondition}) ");
}
if (distinctType != "None")
{
dataQuery.Append(") t WHERE rn = 1 ");
}
dataQuery.Append("ORDER BY StartTime DESC");
// 执行数据查询
IDbCommand dataCmd = conn.CreateCommand();
dataCmd.CommandText = dataQuery.ToString();
MySqlCommand command = dataCmd as MySqlCommand;
MySqlDataAdapter adapter = new(command);
DataSet ds = new();
adapter.Fill(ds);
DataTable dt = ds.Tables[0];
// 使用ClosedXML创建Excel
using (var workbook = new XLWorkbook())
{
var worksheet = workbook.Worksheets.Add(dt, "Sheet");
// 设置标题行样式
var headerRow = worksheet.Row(1);
headerRow.Style.Font.Bold = true;
// 自动调整列宽
worksheet.Columns().AdjustToContents();
using (var stream = new MemoryStream())
{
workbook.SaveAs(stream);
var content = stream.ToArray();
return File(content, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"{tbName}_Export.xlsx");
}
}
}
}
catch (Exception ex)
{
return StatusCode(500, $"导出失败: {ex.Message}");
}
}
public ReturnInfoPage GetTestSummaryTable([FromBody] TestLog T)
{
ReturnInfoPage returnInfo = new();
string? dbName = T.dbName;
string? tbName = T.tbName;
string? StartTime = T.StartTime;
string? EndTime = T.EndTime;
string? TestResult = T.TestResult;
List<string>? FailSteps = T.FailSteps;
string? ColumnList = T.ColumnList;
int page = T.Page;
int pageSize = T.PageSize;
string distinctType = T.DistinctType ?? "None"; // 获取去重类型,默认为不去重
if (string.IsNullOrEmpty(StartTime) || string.IsNullOrEmpty(EndTime))
{
returnInfo.isok = false;
returnInfo.message = "开始时间或结束时间不能为空";
return returnInfo;
}
try
{
using (var q = new UtsManageContext())
{
using IDbConnection conn = q.Database.GetDbConnection();
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
// 1. 构建基础查询(总数查询)
StringBuilder baseQuery = new StringBuilder();
if (distinctType == "None")
{
// 不去重的情况
baseQuery.Append($"SELECT COUNT(*) AS Total FROM {dbName}.{tbName} ");
baseQuery.Append($"WHERE StartTime BETWEEN '{StartTime} 00:00:00' AND '{EndTime} 23:59:59' ");
}
else
{
// 去重的情况,需要计算去重后的总数
baseQuery.Append($"SELECT COUNT(DISTINCT DUT_SN) AS Total FROM {dbName}.{tbName} ");
baseQuery.Append($"WHERE StartTime BETWEEN '{StartTime} 00:00:00' AND '{EndTime} 23:59:59' ");
}
if (!string.IsNullOrEmpty(TestResult))
{
baseQuery.Append($"AND TestResult = '{TestResult}' ");
}
if (FailSteps != null && FailSteps.Count > 0)
{
// 使用IN语句查询多个失败步骤
string failStepsCondition = string.Join(",", FailSteps.Select(f => $"'{MySqlHelper.EscapeString(f)}'"));
baseQuery.Append($"AND Failsteps IN ({failStepsCondition}) ");
}
// 执行总数查询
IDbCommand countCmd = conn.CreateCommand();
countCmd.CommandText = baseQuery.ToString();
long totalCount = Convert.ToInt64(countCmd.ExecuteScalar());
// 2. 计算总通过数
long totalPassCount = 0;
StringBuilder totalPassQuery = new StringBuilder();
if (distinctType == "None")
{
// 不去重的情况:统计所有通过的记录
totalPassQuery.Append($"SELECT COUNT(*) FROM {dbName}.{tbName} ");
totalPassQuery.Append($"WHERE StartTime BETWEEN '{StartTime} 00:00:00' AND '{EndTime} 23:59:59' ");
totalPassQuery.Append($"AND TestResult = '1'");
if (!string.IsNullOrEmpty(TestResult))
{
totalPassQuery.Append($"AND TestResult = '{TestResult}' ");
}
if (FailSteps != null && FailSteps.Count > 0)
{
// 使用IN语句查询多个失败步骤
string failStepsCondition = string.Join(",", FailSteps.Select(f => $"'{MySqlHelper.EscapeString(f)}'"));
totalPassQuery.Append($"AND Failsteps IN ({failStepsCondition}) ");
}
}
else
{
// 去重的情况:统计去重后记录中通过的数量
string orderDirection = distinctType == "Latest" ? "DESC" : "ASC";
totalPassQuery.Append($"SELECT COUNT(*) FROM (");
totalPassQuery.Append($"SELECT *, ROW_NUMBER() OVER (PARTITION BY DUT_SN ORDER BY StartTime {orderDirection}) AS rn ");
totalPassQuery.Append($"FROM {dbName}.{tbName} ");
totalPassQuery.Append($"WHERE StartTime BETWEEN '{StartTime} 00:00:00' AND '{EndTime} 23:59:59' ");
if (!string.IsNullOrEmpty(TestResult))
{
totalPassQuery.Append($"AND TestResult = '{TestResult}' ");
}
if (FailSteps != null && FailSteps.Count > 0)
{
// 使用IN语句查询多个失败步骤
string failStepsCondition = string.Join(",", FailSteps.Select(f => $"'{MySqlHelper.EscapeString(f)}'"));
totalPassQuery.Append($"AND Failsteps IN ({failStepsCondition}) ");
}
totalPassQuery.Append($") as t WHERE rn = 1 AND TestResult = '1'");
}
IDbCommand totalPassCmd = conn.CreateCommand();
totalPassCmd.CommandText = totalPassQuery.ToString();
totalPassCount = Convert.ToInt64(totalPassCmd.ExecuteScalar());
// 3. 计算通过率
double passRate = totalCount > 0 ? Math.Round((double)totalPassCount / totalCount * 100, 2) : 0;
// 4. 构建数据查询
StringBuilder dataQuery = new StringBuilder();
if (distinctType == "None")
{
// 不去重的情况
dataQuery.Append("SELECT ID, ServiceID AS SID, StartTime, DUT_SN, TestResult, Failsteps");
if (!string.IsNullOrEmpty(ColumnList))
{
dataQuery.Append(ColumnList);
}
dataQuery.Append($" FROM {dbName}.{tbName} ");
dataQuery.Append($"WHERE StartTime BETWEEN '{StartTime} 00:00:00' AND '{EndTime} 23:59:59' ");
}
else
{
// 去重的情况
string orderDirection = distinctType == "Latest" ? "DESC" : "ASC";
dataQuery.Append("SELECT ID, ServiceID AS SID, StartTime, DUT_SN, TestResult, Failsteps");
if (!string.IsNullOrEmpty(ColumnList))
{
dataQuery.Append(ColumnList);
}
dataQuery.Append(" FROM (");
dataQuery.Append("SELECT *, ROW_NUMBER() OVER (PARTITION BY DUT_SN ORDER BY StartTime ");
dataQuery.Append(orderDirection);
dataQuery.Append($") AS rn FROM {dbName}.{tbName} ");
dataQuery.Append($"WHERE StartTime BETWEEN '{StartTime} 00:00:00' AND '{EndTime} 23:59:59' ");
if (!string.IsNullOrEmpty(TestResult))
{
dataQuery.Append($"AND TestResult = '{TestResult}' ");
}
if (FailSteps != null && FailSteps.Count > 0)
{
// 使用IN语句查询多个失败步骤
string failStepsCondition = string.Join(",", FailSteps.Select(f => $"'{MySqlHelper.EscapeString(f)}'"));
dataQuery.Append($"AND Failsteps IN ({failStepsCondition}) ");
}
dataQuery.Append(") t WHERE rn = 1 ");
}
if (distinctType == "None")
{
// 不去重的情况下添加条件
if (!string.IsNullOrEmpty(TestResult))
{
dataQuery.Append($"AND TestResult = '{TestResult}' ");
}
if (FailSteps != null && FailSteps.Count > 0)
{
// 使用IN语句查询多个失败步骤
string failStepsCondition = string.Join(",", FailSteps.Select(f => $"'{MySqlHelper.EscapeString(f)}'"));
dataQuery.Append($"AND Failsteps IN ({failStepsCondition}) ");
}
}
// 添加排序和分页
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;
MySqlDataAdapter adapter = new(command);
DataSet ds = new();
adapter.Fill(ds);
DataTable dt = ds.Tables[0];
// 处理结果
List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();
foreach (DataRow item in dt.Rows)
{
Dictionary<string, string> dic = new Dictionary<string, string>();
foreach (DataColumn col in dt.Columns)
{
dic.Add(col.ColumnName, item[col]?.ToString() ?? "");
}
list.Add(dic);
}
returnInfo.isok = true;
returnInfo.total = totalCount;
returnInfo.response = list;
returnInfo.passCount = totalPassCount; // 修改字段名
returnInfo.passRate = passRate;
}
}
catch (Exception ex)
{
returnInfo.isok = false;
returnInfo.message = ex.Message;
}
return returnInfo;
}
}
public class TestLogExportRequest
{
public string? dbName { get; set; }
public string? tbName { get; set; }
public string StartTime { get; set; }
public string EndTime { get; set; }
public string? TestResult { get; set; }
public List<string>? FailSteps { get; set; }
public string? ColumnList { get; set; }
public string DistinctType { get; set; } = "None"; // 新增字段None-不去重, Latest-保留最新, Earliest-保留最早
}
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 class TestLogsQueryModel
{
public string DBName { get; set; }
public string SnCode { get; set; }
public List<DBL> DbList { get; set; }
}
public class DBL
{
public string ProId { get; set; }
public string Step { get; set; }
}
public class TestLog : TestLogExportRequest
{
public int Page { get; set; }
public int PageSize { get; set; }
}
// 扩展ReturnInfoPage类以包含一次通过数和通过率
public class ReturnInfoPage
{
public bool isok { get; set; }
public string message { get; set; }
public long total { get; set; }
public object response { get; set; }
public long passCount { get; set; }
public double passRate { get; set; }
}
}

View File

@@ -0,0 +1,298 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using ViewModels;
using WebAPIServer.Extensions;
using WebAPIServer.Models;
namespace WebAPIServer.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class UsersController : ControllerBase
{
/// <summary>
/// 删除用户
/// </summary>
/// <param name="LLL"></param>
/// <returns></returns>
[HttpPost()]
[Authorize()]
public ReturnInfo DelUser([FromBody] TblUtsManageUser LLL)
{
ReturnInfo returnInfo = new ReturnInfo();
try
{
using (var q = new UtsManageContext())
{
var FFF = q.TblUtsManageUsers.FirstOrDefault(A => A.Id == LLL.Id);
if (FFF != null)
{
FFF.IsValid = false;
q.TblUtsManageUsers.Update(FFF);
q.SaveChanges();
returnInfo.isok = true;
}
}
}
catch (Exception ex)
{
returnInfo.isok = false;
returnInfo.message = ex.Message;
}
return returnInfo;
}
/// <summary>
/// 修改用户
/// </summary>
/// <param name="LLL"></param>
/// <returns></returns>
[HttpPost()]
[Authorize()]
public ReturnInfo EditUser([FromBody] ReturnUser LLL)
{
ReturnInfo returnInfo = new ReturnInfo();
try
{
using (var q = new UtsManageContext())
{
var lll = q.TblUtsManageUsers.SingleOrDefault(A => A.Id == LLL.Id);
if (lll != null)
{
string username = LLL.UserName;
int companyId = LLL.CompanyId;
string mobile = LLL.Mobile;
string weiXin = LLL.WeiXin;
string email = LLL.Email;
lll.UserName = username;
lll.CompanyId = companyId;
lll.Mobile = mobile;
lll.WeiXin = weiXin;
lll.Email = email;
lll.UpdateTime = DateTime.Now;
q.TblUtsManageUsers.Update(lll);
q.SaveChanges();
returnInfo.isok = true;
}
}
}
catch (Exception ex)
{
returnInfo.isok = false;
returnInfo.message = ex.Message;
}
return returnInfo;
}
/// <summary>
/// 重置密码
/// </summary>
/// <param name="LLL"></param>
/// <returns></returns>
[HttpPost()]
[Authorize()]
public ReturnInfo ResetPassWord([FromBody] PWD_Reset LLL)
{
ReturnInfo returnInfo = new ReturnInfo();
try
{
using (var q = new UtsManageContext())
{
var QQQ = q.TblUtsManageUsers.SingleOrDefault(A => A.Id == LLL.Id);
if (QQQ != null)
{
QQQ.Password = LLL.PlaintextPwd.ToMD5().ToMD5();
QQQ.PlaintextPwd = LLL.PlaintextPwd;
q.TblUtsManageUsers.Update(QQQ);
q.SaveChanges();
returnInfo.isok = true;
}
}
}
catch (Exception ex)
{
returnInfo.isok = false;
returnInfo.message = ex.Message;
}
return returnInfo;
}
/// <summary>
/// 新增密码为123456
/// </summary>
/// <param name="LLL"></param>
/// <returns></returns>
[HttpPost()]
[Authorize()]
public ReturnInfo NewPassWord([FromBody] PWD_Reset LLL)
{
ReturnInfo returnInfo = new ReturnInfo();
try
{
using (var q = new UtsManageContext())
{
var Q = q.TblUtsManageUsers.SingleOrDefault(A => A.Id == LLL.Id);
if (Q != null)
{
Q.Password = "123456".ToMD5().ToMD5();
Q.PlaintextPwd = "123456";
q.TblUtsManageUsers.Update(Q);
q.SaveChanges();
returnInfo.isok = true;
}
}
}
catch (Exception ex)
{
returnInfo.isok = false;
returnInfo.message = ex.Message;
}
return returnInfo;
}
/// <summary>
/// 获取用户信息
/// </summary>
/// <param name="S"></param>
/// <returns></returns>
[HttpPost()]
[Authorize()]
public ReturnInfo GetUserInfo([FromBody] QueryAll_Or_Single S)
{
ReturnInfo returnInfo = new ReturnInfo();
try
{
using (var q = new UtsManageContext())
{
if (S.IsAll)
{
returnInfo.isok = true;
returnInfo.response = q.TblUtsManageUsers.Where(A => A.IsValid).Select(F => new ReturnUser
{
Id = F.Id,
UserName = F.UserName,
CompanyId = F.CompanyId,
Mobile = F.Mobile,
WeiXin = F.WeiXin,
Email = F.Email,
}).ToList();
}
else
{
returnInfo.isok = true;
var a = q.TblUtsManageUsers.SingleOrDefault(A => A.Id == S.ID);
if (a != null)
{
ReturnUser u = new ReturnUser();
u.Id = a.Id;
u.UserName = a.UserName;
u.CompanyId = a.CompanyId;
u.Mobile = a.Mobile;
u.WeiXin = a.WeiXin;
u.Email = a.Email;
returnInfo.response = u;
}
}
}
}
catch (Exception ex)
{
returnInfo.isok = false;
returnInfo.message = ex.Message;
}
return returnInfo;
}
/// <summary>
/// 新增用户
/// </summary>
/// <param name="LLL"></param>
/// <returns></returns>
[HttpPost()]
[Authorize()]
public ReturnInfo AddUser([FromBody] ReturnUser LLL)
{
ReturnInfo returnInfo = new ReturnInfo();
try
{
// {
//"id": 0,
//"userName": "test6",
//"companyId": "",
//"companyName": "",
//"mobile": "",
//"weiXin": "",
//"email": "",
//"resetpsw": true,
//"permissions": [],
//"company": ""
//}
string username = LLL.UserName;
int companyId = LLL.CompanyId;
string mobile = LLL.Mobile;
string weiXin = LLL.WeiXin;
string email = LLL.Email;
TblUtsManageUser lll = new TblUtsManageUser();
lll.UserName = username;
lll.CompanyId = companyId;
lll.Mobile = mobile;
lll.WeiXin = weiXin;
lll.Email = email;
lll.IsValid = true;
lll.CreateTime = DateTime.Now;
lll.UpdateTime = DateTime.Now;
using (var q = new UtsManageContext())
{
var Q = q.TblUtsManageUsers.Where(A => A.UserName.Equals(username));
if (Q.Count() > 0)
{
returnInfo.isok = false;
returnInfo.message = "此用户名已经存在";
}
else
{
lll.PlaintextPwd = "123456";
lll.Password = "123456".ToMD5().ToMD5(); ;
q.TblUtsManageUsers.Add(lll);
returnInfo.isok = true;
}
q.SaveChanges();
}
}
catch (Exception ex)
{
returnInfo.isok = false;
returnInfo.message = ex.Message;
}
return returnInfo;
}
}
/// <summary>
/// 返回用户信息
/// </summary>
public class ReturnUser
{
public int Id { get; set; }
public string UserName { get; set; }
public int CompanyId { get; set; }
public string Mobile { get; set; }
public string WeiXin { get; set; }
public string Email { get; set; }
}
public class PWD_Reset
{
public int Id { get; set; }
public string PlaintextPwd { get; set; }
}
}

View File

@@ -0,0 +1,47 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using ViewModels;
using WebAPIServer.Common;
namespace WebAPIServer.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet()]
public ReturnInfo GetAll_WebApiMethod(string VariableName)
{
ReturnInfo i = new ReturnInfo();
i.isok = true;
try
{
var result = StaticData.scope.GetVariable(VariableName);
i.response = result;
}
catch (Exception ex)
{
i.isok = false;
i.message = ex.Message;
}
return i;
}
[HttpPost()]
public ReturnInfo UpdateData()
{
ReturnInfo i = new ReturnInfo();
i.isok = true;
try
{
StaticData.GetWebAPIMethod();
i.response = "sucess";
}
catch (Exception ex)
{
i.isok = false;
i.message = ex.Message;
}
return i;
}
}
}

View File

@@ -0,0 +1,33 @@
using Microsoft.AspNetCore.Mvc;
namespace WebAPIServer.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
}