using System.Data;
using Microsoft.Data.SqlClient;
namespace YY.Admin.Services.Service.EquipmentDb;
///
/// 开炼机动作中间表 MCSToMES_Act_Mill 只读查询(直连设备库)。
///
public interface IMcsActMillService
{
Task<(IReadOnlyList Records, long Total)> PageAsync(
int pageNo,
int pageSize,
string? actName = null,
int? actAddr = null,
CancellationToken cancellationToken = default);
}
public sealed class McsActMillRow
{
public string? Guid { get; set; }
public int? ActAddr { get; set; }
public string? ActName { get; set; }
public string? ActNameEn { get; set; }
public string? ActMemo { get; set; }
public int? ActRepaddr { get; set; }
public DateTime? WriteTime { get; set; }
public DateTime? ReadTime { get; set; }
public int? RwFlag { get; set; }
}
public sealed class McsActMillService : IMcsActMillService
{
private const string TableName = "MCSToMES_Act_Mill";
private readonly IEquipmentDbConnectionFactory _factory;
public McsActMillService(IEquipmentDbConnectionFactory factory)
{
_factory = factory;
}
public async Task<(IReadOnlyList Records, long Total)> PageAsync(
int pageNo,
int pageSize,
string? actName = null,
int? actAddr = null,
CancellationToken cancellationToken = default)
{
if (pageNo < 1) pageNo = 1;
if (pageSize < 1) pageSize = 20;
_factory.Reload();
await using var conn = _factory.CreateConnection();
await conn.OpenAsync(cancellationToken).ConfigureAwait(false);
var where = new List();
var parameters = new List();
if (!string.IsNullOrWhiteSpace(actName))
{
where.Add("act_name LIKE @actName");
parameters.Add(new SqlParameter("@actName", SqlDbType.NVarChar, 50) { Value = "%" + actName.Trim() + "%" });
}
if (actAddr.HasValue)
{
where.Add("act_addr = @actAddr");
parameters.Add(new SqlParameter("@actAddr", SqlDbType.Int) { Value = actAddr.Value });
}
var whereSql = where.Count == 0 ? "" : " WHERE " + string.Join(" AND ", where);
var countSql = $"SELECT COUNT(1) FROM [{TableName}]{whereSql}";
EquipmentDbWhitelist.ValidateSql(countSql, TableName);
long total;
await using (var countCmd = conn.CreateCommand())
{
countCmd.CommandText = countSql;
countCmd.Parameters.AddRange(CloneParams(parameters));
var scalar = await countCmd.ExecuteScalarAsync(cancellationToken).ConfigureAwait(false);
total = Convert.ToInt64(scalar ?? 0);
}
var offset = (pageNo - 1) * pageSize;
var listSql = $@"
SELECT [GUID], [act_addr], [act_name], [act_name_en], [act_memo], [act_Repaddr], [WriteTime], [ReadTime], [RW_Flag]
FROM [{TableName}]{whereSql}
ORDER BY [WriteTime] DESC, [GUID]
OFFSET @offset ROWS FETCH NEXT @pageSize ROWS ONLY";
EquipmentDbWhitelist.ValidateSql(listSql, TableName);
var rows = new List();
await using (var listCmd = conn.CreateCommand())
{
listCmd.CommandText = listSql;
listCmd.Parameters.AddRange(CloneParams(parameters));
listCmd.Parameters.Add(new SqlParameter("@offset", SqlDbType.Int) { Value = offset });
listCmd.Parameters.Add(new SqlParameter("@pageSize", SqlDbType.Int) { Value = pageSize });
await using var reader = await listCmd.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false);
while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
{
rows.Add(new McsActMillRow
{
Guid = reader["GUID"] as string,
ActAddr = reader["act_addr"] == DBNull.Value ? null : Convert.ToInt32(reader["act_addr"]),
ActName = reader["act_name"] as string,
ActNameEn = reader["act_name_en"] as string,
ActMemo = reader["act_memo"] as string,
ActRepaddr = reader["act_Repaddr"] == DBNull.Value ? null : Convert.ToInt32(reader["act_Repaddr"]),
WriteTime = reader["WriteTime"] == DBNull.Value ? null : Convert.ToDateTime(reader["WriteTime"]),
ReadTime = reader["ReadTime"] == DBNull.Value ? null : Convert.ToDateTime(reader["ReadTime"]),
RwFlag = reader["RW_Flag"] == DBNull.Value ? null : Convert.ToInt32(reader["RW_Flag"]),
});
}
}
return (rows, total);
}
private static SqlParameter[] CloneParams(List source)
{
return source.Select(p => new SqlParameter(p.ParameterName, p.SqlDbType)
{
Size = p.Size,
Value = p.Value ?? DBNull.Value
}).ToArray();
}
}