Log face-template saves only for new inserts and pass updatedBy
Business-log “Saved successfully” only when a template is newly inserted; skip already-present templates in biz logs. Pass hikvision-service as updatedBy on user upserts. Show machine context in user-sync logs and clear is_deleted after device add Include Machine ID/IP on add/update/remove business logs. After a successful device user create, upsert the DB row so is_deleted returns to 0 with updated_by set.main
parent
e5a3689434
commit
7b66f9319a
|
|
@ -306,7 +306,33 @@ internal sealed partial class HikvisionAttendanceManager
|
||||||
|
|
||||||
created++;
|
created++;
|
||||||
_logger.Totals.UsersAdded++;
|
_logger.Totals.UsersAdded++;
|
||||||
_logger.Biz(BizChannel.UserSync, srcUser.EmployeeNo + " added successfully.", "");
|
_logger.Biz(BizChannel.UserSync,
|
||||||
|
"Machine ID : " + (target.DeviceId ?? ""),
|
||||||
|
"Machine IP : " + (target.Ip ?? ""),
|
||||||
|
"",
|
||||||
|
srcUser.EmployeeNo + " added successfully.",
|
||||||
|
"");
|
||||||
|
// Clear is_deleted / is_deletion_requested so DB matches the live device user.
|
||||||
|
if (_config.EnableDbIntegration && _attendanceMachineUserRepository != null)
|
||||||
|
{
|
||||||
|
if (!_attendanceMachineUserRepository.UpsertMachineUser(
|
||||||
|
target.DeviceId ?? "",
|
||||||
|
srcUser.EmployeeNo,
|
||||||
|
srcUser.Name ?? "",
|
||||||
|
"hikvision-service",
|
||||||
|
out var upsertErr))
|
||||||
|
{
|
||||||
|
_logger.Warn("UserSync: device add OK but DB is_deleted reset failed employeeNo=" +
|
||||||
|
srcUser.EmployeeNo + " machine_id=" + (target.DeviceId ?? "") +
|
||||||
|
" err=" + upsertErr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_logger.Diag("user_sync",
|
||||||
|
"DB attendance_machine_user reactivated is_deleted=0 employeeNo=" +
|
||||||
|
srcUser.EmployeeNo + " machine_id=" + (target.DeviceId ?? ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
createdNew = true;
|
createdNew = true;
|
||||||
tgtRow = new UserDto
|
tgtRow = new UserDto
|
||||||
{
|
{
|
||||||
|
|
@ -323,7 +349,12 @@ internal sealed partial class HikvisionAttendanceManager
|
||||||
{
|
{
|
||||||
updated++;
|
updated++;
|
||||||
_logger.Totals.UsersUpdated++;
|
_logger.Totals.UsersUpdated++;
|
||||||
_logger.Biz(BizChannel.UserSync, srcUser.EmployeeNo + " updated successfully.", "");
|
_logger.Biz(BizChannel.UserSync,
|
||||||
|
"Machine ID : " + (target.DeviceId ?? ""),
|
||||||
|
"Machine IP : " + (target.Ip ?? ""),
|
||||||
|
"",
|
||||||
|
srcUser.EmployeeNo + " updated successfully.",
|
||||||
|
"");
|
||||||
Bump(UserSyncStatus.ExistsUserFieldsUpdated);
|
Bump(UserSyncStatus.ExistsUserFieldsUpdated);
|
||||||
tgtRow.Name = srcUser.Name;
|
tgtRow.Name = srcUser.Name;
|
||||||
tgtRow.ValidBeginTime = srcUser.ValidBeginTime;
|
tgtRow.ValidBeginTime = srcUser.ValidBeginTime;
|
||||||
|
|
@ -475,7 +506,12 @@ internal sealed partial class HikvisionAttendanceManager
|
||||||
{
|
{
|
||||||
_logger.Ops(OpsMarkers.UserDelete, emp + " -> Device " + target.DeviceId + " = DELETED SUCCESSFULLY");
|
_logger.Ops(OpsMarkers.UserDelete, emp + " -> Device " + target.DeviceId + " = DELETED SUCCESSFULLY");
|
||||||
_logger.Totals.UsersRemoved++;
|
_logger.Totals.UsersRemoved++;
|
||||||
_logger.Biz(BizChannel.UserSync, emp + " removed successfully.", "");
|
_logger.Biz(BizChannel.UserSync,
|
||||||
|
"Machine ID : " + (target.DeviceId ?? ""),
|
||||||
|
"Machine IP : " + (target.Ip ?? ""),
|
||||||
|
"",
|
||||||
|
emp + " removed successfully.",
|
||||||
|
"");
|
||||||
Bump(UserSyncStatus.DeletedOnTargetNotInSource);
|
Bump(UserSyncStatus.DeletedOnTargetNotInSource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -592,7 +628,12 @@ internal sealed partial class HikvisionAttendanceManager
|
||||||
deletedOk++;
|
deletedOk++;
|
||||||
_logger.Totals.UsersRemoved++;
|
_logger.Totals.UsersRemoved++;
|
||||||
_logger.Ops(OpsMarkers.UserDelete, employeeNo + " -> Device " + machineId + " = DELETED SUCCESSFULLY");
|
_logger.Ops(OpsMarkers.UserDelete, employeeNo + " -> Device " + machineId + " = DELETED SUCCESSFULLY");
|
||||||
_logger.Biz(BizChannel.UserSync, employeeNo + " removed successfully.", "");
|
_logger.Biz(BizChannel.UserSync,
|
||||||
|
"Machine ID : " + machineId,
|
||||||
|
"Machine IP : " + machineIp,
|
||||||
|
"",
|
||||||
|
employeeNo + " removed successfully.",
|
||||||
|
"");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -4315,7 +4315,7 @@ internal sealed partial class HikvisionAttendanceManager : IDisposable
|
||||||
var serial = (eno ?? "").Trim();
|
var serial = (eno ?? "").Trim();
|
||||||
if (serial.Length == 0)
|
if (serial.Length == 0)
|
||||||
continue;
|
continue;
|
||||||
if (_attendanceMachineUserRepository.UpsertMachineUser(deviceId.Trim(), serial, "", out var upErr))
|
if (_attendanceMachineUserRepository.UpsertMachineUser(deviceId.Trim(), serial, "", "hikvision-service", out var upErr))
|
||||||
upsertedUsers++;
|
upsertedUsers++;
|
||||||
else
|
else
|
||||||
upsertFailed++;
|
upsertFailed++;
|
||||||
|
|
@ -4437,7 +4437,7 @@ internal sealed partial class HikvisionAttendanceManager : IDisposable
|
||||||
if (_config.EnableDbIntegration && _attendanceMachineUserRepository != null &&
|
if (_config.EnableDbIntegration && _attendanceMachineUserRepository != null &&
|
||||||
TryExtractNameFromUserInfoSearch(userInfoRaw, cardNo.Trim(), out var userName))
|
TryExtractNameFromUserInfoSearch(userInfoRaw, cardNo.Trim(), out var userName))
|
||||||
{
|
{
|
||||||
_attendanceMachineUserRepository.UpsertMachineUser(deviceId.Trim(), cardNo.Trim(), userName ?? "", out _);
|
_attendanceMachineUserRepository.UpsertMachineUser(deviceId.Trim(), cardNo.Trim(), userName ?? "", "hikvision-service", out _);
|
||||||
}
|
}
|
||||||
|
|
||||||
var facePath = userFaceUrl;
|
var facePath = userFaceUrl;
|
||||||
|
|
@ -4501,9 +4501,11 @@ internal sealed partial class HikvisionAttendanceManager : IDisposable
|
||||||
{
|
{
|
||||||
var bytes = Convert.FromBase64String(userPayload.face.dataBase64);
|
var bytes = Convert.FromBase64String(userPayload.face.dataBase64);
|
||||||
if (_attendanceMachineFaceTemplateRepository.UpsertFaceTemplate(cardNo.Trim(), bytes, DateTime.UtcNow, true, deviceId.Trim(), session.Device.Ip, out var createdNew, out var dbErr))
|
if (_attendanceMachineFaceTemplateRepository.UpsertFaceTemplate(cardNo.Trim(), bytes, DateTime.UtcNow, true, deviceId.Trim(), session.Device.Ip, out var createdNew, out var dbErr))
|
||||||
|
{
|
||||||
|
if (createdNew)
|
||||||
{
|
{
|
||||||
_logger.Ops(OpsMarkers.TemplateDeviceToDb,
|
_logger.Ops(OpsMarkers.TemplateDeviceToDb,
|
||||||
cardNo.Trim() + " -> DB = FACE TEMPLATE " + (createdNew ? "INSERTED" : "UPDATED") + " SUCCESSFULLY");
|
cardNo.Trim() + " -> DB = FACE TEMPLATE INSERTED SUCCESSFULLY");
|
||||||
_logger.Totals.TemplatesSaved++;
|
_logger.Totals.TemplatesSaved++;
|
||||||
_logger.Biz(BizChannel.Template,
|
_logger.Biz(BizChannel.Template,
|
||||||
"Employee " + cardNo.Trim(),
|
"Employee " + cardNo.Trim(),
|
||||||
|
|
@ -4515,6 +4517,16 @@ internal sealed partial class HikvisionAttendanceManager : IDisposable
|
||||||
_logger.BizSeparator(BizChannel.Template);
|
_logger.BizSeparator(BizChannel.Template);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
// Already in DB — do not rewrite and do not spam business logs.
|
||||||
|
_logger.Diag("template_fetch",
|
||||||
|
"face template already in DB — skipped employee=" + cardNo.Trim() +
|
||||||
|
" device=" + deviceId);
|
||||||
|
_logger.Ops(OpsMarkers.TemplateDeviceToDb,
|
||||||
|
cardNo.Trim() + " -> DB = FACE TEMPLATE SKIPPED reason=\"already present\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
_logger.OpsError(OpsMarkers.TemplateDeviceToDb,
|
_logger.OpsError(OpsMarkers.TemplateDeviceToDb,
|
||||||
cardNo.Trim() + " -> DB = FACE TEMPLATE FAILED reason=\"" + dbErr + "\"");
|
cardNo.Trim() + " -> DB = FACE TEMPLATE FAILED reason=\"" + dbErr + "\"");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue