Normalize Backend Scan Device Context
Ensures backend scan requests use a resolved Device ID and logs backend startup Device ID details.feature/centralized-offline-canteen
parent
11ab230d87
commit
95c8ac7f63
|
|
@ -111,7 +111,7 @@ public static class CanteenBackendHost
|
||||||
|
|
||||||
if (method == "POST" && path.Equals("/api/rfid/scan", StringComparison.OrdinalIgnoreCase))
|
if (method == "POST" && path.Equals("/api/rfid/scan", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
await HandleScanAsync(ctx, rfid).ConfigureAwait(false);
|
await HandleScanAsync(ctx, rfid, backend).ConfigureAwait(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -310,7 +310,7 @@ public static class CanteenBackendHost
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task HandleScanAsync(HttpListenerContext ctx, RfidService rfid)
|
private static async Task HandleScanAsync(HttpListenerContext ctx, RfidService rfid, CanteenBackendServices backend)
|
||||||
{
|
{
|
||||||
ScanRequest? dto;
|
ScanRequest? dto;
|
||||||
using (var reader = new StreamReader(ctx.Request.InputStream, ctx.Request.ContentEncoding))
|
using (var reader = new StreamReader(ctx.Request.InputStream, ctx.Request.ContentEncoding))
|
||||||
|
|
@ -339,7 +339,9 @@ public static class CanteenBackendHost
|
||||||
|
|
||||||
var clientCtx = new RfidScanClientContext
|
var clientCtx = new RfidScanClientContext
|
||||||
{
|
{
|
||||||
DeviceId = dto.DeviceId?.Trim() ?? string.Empty,
|
DeviceId = string.IsNullOrWhiteSpace(dto.DeviceId)
|
||||||
|
? backend.Config.GetDeviceId()
|
||||||
|
: dto.DeviceId.Trim(),
|
||||||
SiteId = dto.SiteId?.Trim() ?? string.Empty,
|
SiteId = dto.SiteId?.Trim() ?? string.Empty,
|
||||||
IpAddress = ip
|
IpAddress = ip
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -129,23 +129,30 @@ public class ConfigService : IConfigService
|
||||||
|
|
||||||
public string GetDeviceId()
|
public string GetDeviceId()
|
||||||
{
|
{
|
||||||
//var id = _config.DeviceId ?? string.Empty;
|
if (!string.IsNullOrWhiteSpace(_config.DeviceId))
|
||||||
var id = Environment.MachineName;
|
return _config.DeviceId.Trim();
|
||||||
if (string.IsNullOrWhiteSpace(id))
|
|
||||||
{
|
_config.DeviceId = ResolveMachineDeviceId();
|
||||||
id = Guid.NewGuid().ToString("N");
|
SaveConfig();
|
||||||
_config.DeviceId = id;
|
return _config.DeviceId;
|
||||||
SaveConfig();
|
|
||||||
}
|
|
||||||
return id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetDeviceId(string deviceId)
|
public void SetDeviceId(string deviceId)
|
||||||
{
|
{
|
||||||
_config.DeviceId = deviceId ?? string.Empty;
|
_config.DeviceId = string.IsNullOrWhiteSpace(deviceId)
|
||||||
|
? ResolveMachineDeviceId()
|
||||||
|
: deviceId.Trim();
|
||||||
SaveConfig();
|
SaveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string ResolveMachineDeviceId()
|
||||||
|
{
|
||||||
|
var machineName = Environment.MachineName;
|
||||||
|
return string.IsNullOrWhiteSpace(machineName)
|
||||||
|
? Guid.NewGuid().ToString("N")
|
||||||
|
: machineName.Trim();
|
||||||
|
}
|
||||||
|
|
||||||
public bool GetRememberAdminCredentials() => _config.RememberAdminCredentials;
|
public bool GetRememberAdminCredentials() => _config.RememberAdminCredentials;
|
||||||
|
|
||||||
public void SetRememberAdminCredentials(bool remember)
|
public void SetRememberAdminCredentials(bool remember)
|
||||||
|
|
|
||||||
|
|
@ -55,8 +55,23 @@ public sealed class BackendHostConfigService : IConfigService
|
||||||
|
|
||||||
public void ApplyLocationSiteIdFromAuth(string? locationSiteId) { }
|
public void ApplyLocationSiteIdFromAuth(string? locationSiteId) { }
|
||||||
|
|
||||||
public string GetDeviceId() => _persisted.DeviceId ?? string.Empty;
|
public string GetDeviceId()
|
||||||
public void SetDeviceId(string deviceId) { _persisted.DeviceId = deviceId ?? string.Empty; SavePersisted(); }
|
{
|
||||||
|
if (!string.IsNullOrWhiteSpace(_persisted.DeviceId))
|
||||||
|
return _persisted.DeviceId.Trim();
|
||||||
|
|
||||||
|
_persisted.DeviceId = ResolveMachineDeviceId();
|
||||||
|
SavePersisted();
|
||||||
|
return _persisted.DeviceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetDeviceId(string deviceId)
|
||||||
|
{
|
||||||
|
_persisted.DeviceId = string.IsNullOrWhiteSpace(deviceId)
|
||||||
|
? ResolveMachineDeviceId()
|
||||||
|
: deviceId.Trim();
|
||||||
|
SavePersisted();
|
||||||
|
}
|
||||||
|
|
||||||
public bool GetRememberAdminCredentials() => false;
|
public bool GetRememberAdminCredentials() => false;
|
||||||
public void SetRememberAdminCredentials(bool remember) { }
|
public void SetRememberAdminCredentials(bool remember) { }
|
||||||
|
|
@ -110,6 +125,14 @@ public sealed class BackendHostConfigService : IConfigService
|
||||||
public string GetLocalServerListenUrls() => GetListenUrls();
|
public string GetLocalServerListenUrls() => GetListenUrls();
|
||||||
public void SetLocalServerListenUrls(string urls) { }
|
public void SetLocalServerListenUrls(string urls) { }
|
||||||
|
|
||||||
|
private static string ResolveMachineDeviceId()
|
||||||
|
{
|
||||||
|
var machineName = Environment.MachineName;
|
||||||
|
return string.IsNullOrWhiteSpace(machineName)
|
||||||
|
? Guid.NewGuid().ToString("N")
|
||||||
|
: machineName.Trim();
|
||||||
|
}
|
||||||
|
|
||||||
private void MergeFromAppSettingsIfNeeded()
|
private void MergeFromAppSettingsIfNeeded()
|
||||||
{
|
{
|
||||||
var mysql = _configuration["MySqlConnectionString"];
|
var mysql = _configuration["MySqlConnectionString"];
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,9 @@ public sealed class CanteenBackendWorker : BackgroundService
|
||||||
db.EnsureDatabaseCreated();
|
db.EnsureDatabaseCreated();
|
||||||
|
|
||||||
FileLogger.Info("BackendService", $"Configuration loaded. SQLite DB path={DatabasePath.GetDbPath()}");
|
FileLogger.Info("BackendService", $"Configuration loaded. SQLite DB path={DatabasePath.GetDbPath()}");
|
||||||
|
FileLogger.Info(
|
||||||
|
"BackendService",
|
||||||
|
$"Device ID resolved. MachineName={Environment.MachineName}, DeviceId={_config.GetDeviceId()}");
|
||||||
FileLogger.Info("BackendService", $"ListenUrls={_config.GetLocalServerListenUrls()}");
|
FileLogger.Info("BackendService", $"ListenUrls={_config.GetLocalServerListenUrls()}");
|
||||||
FileLogger.Info(
|
FileLogger.Info(
|
||||||
"BackendService",
|
"BackendService",
|
||||||
|
|
|
||||||
|
|
@ -928,10 +928,14 @@ public partial class ScannerDashboardViewModel : ObservableObject
|
||||||
private static string BuildCsvFromScanRecords(IReadOnlyList<ScanRecord> records)
|
private static string BuildCsvFromScanRecords(IReadOnlyList<ScanRecord> records)
|
||||||
{
|
{
|
||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
sb.AppendLine("Id,CardId,ScanTime,IsSynced,SiteId,DeviceId,IpAddress,EmployeeId,EmployeeName,Department,Meal,Price");
|
sb.AppendLine("Id,CardId,ScanTime,IsSynced,SiteId,DeviceId,IpAddress,EmployeeId,EmployeeName,Department,Meal Session,Meal,Price");
|
||||||
foreach (var r in records)
|
foreach (var r in records)
|
||||||
{
|
{
|
||||||
var localScanTime = r.ScanTime.ToLocalTime();
|
var localScanTime = r.ScanTime.ToLocalTime();
|
||||||
|
var mealSession = r.MealLabel ?? string.Empty;
|
||||||
|
var meal = !string.IsNullOrWhiteSpace(r.MealItems)
|
||||||
|
? r.MealItems
|
||||||
|
: mealSession;
|
||||||
sb.Append(r.Id);
|
sb.Append(r.Id);
|
||||||
sb.Append(',');
|
sb.Append(',');
|
||||||
sb.Append(ToExcelText(r.CardId));
|
sb.Append(ToExcelText(r.CardId));
|
||||||
|
|
@ -952,7 +956,9 @@ public partial class ScannerDashboardViewModel : ObservableObject
|
||||||
sb.Append(',');
|
sb.Append(',');
|
||||||
sb.Append(EscapeCsv(r.Department ?? string.Empty));
|
sb.Append(EscapeCsv(r.Department ?? string.Empty));
|
||||||
sb.Append(',');
|
sb.Append(',');
|
||||||
sb.Append(EscapeCsv(r.MealItems ?? string.Empty));
|
sb.Append(EscapeCsv(mealSession));
|
||||||
|
sb.Append(',');
|
||||||
|
sb.Append(EscapeCsv(meal));
|
||||||
sb.Append(',');
|
sb.Append(',');
|
||||||
sb.Append(r.TotalPrice.ToString("0.##", CultureInfo.InvariantCulture));
|
sb.Append(r.TotalPrice.ToString("0.##", CultureInfo.InvariantCulture));
|
||||||
sb.AppendLine();
|
sb.AppendLine();
|
||||||
|
|
@ -1047,4 +1053,3 @@ public partial class ScannerDashboardViewModel : ObservableObject
|
||||||
_debounceTimer.Stop();
|
_debounceTimer.Stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue