fix(client): notificação Wasabi + ordem de envio mais recente primeiro
Item 2 — Notificação de erro do Wasabi: - client-monitor.js: notifyWasabiError() envia evento IPC 'wasabi-error' ao processo Electron em dois cenários: falha no Direct Upload e Wasabi indisponível no servidor. Throttle de 60s para não inundar o usuário. - index.js: trata 'wasabi-error' no handler IPC do monitorProcess e exibe tray.displayBalloon com iconType 'error'. Item 5 — Ordem de envio (mais novas primeiro): - executarSincronizacaoLocal: após filtrar imagens, ordena por mtime DESC antes de enfileirar — dentista recebe primeiro as imagens do atendimento atual em vez de receber em ordem arbitrária do filesystem. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+20
-1
@@ -1157,7 +1157,13 @@ async function executarSincronizacaoLocal() {
|
||||
|
||||
try {
|
||||
const arquivos = fs.readdirSync(pastaImagensSensor);
|
||||
const imagens = arquivos.filter(file => /\.(png|jpg|jpeg)$/i.test(file));
|
||||
// Ordenar da mais recente para a mais antiga (mtime DESC) para que o
|
||||
// dentista receba primeiro as imagens do atendimento atual.
|
||||
const imagens = arquivos
|
||||
.filter(file => /\.(png|jpg|jpeg)$/i.test(file))
|
||||
.map(file => ({ file, mtime: fs.statSync(path.join(pastaImagensSensor, file)).mtime.getTime() }))
|
||||
.sort((a, b) => b.mtime - a.mtime)
|
||||
.map(({ file }) => file);
|
||||
addLog(`🔎 Encontradas ${imagens.length} imagens locais no total. Verificando pendências com o servidor...`);
|
||||
|
||||
let processadas = 0;
|
||||
@@ -1301,6 +1307,17 @@ function lookupPatientInfo(fileName) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Notifica o processo Electron (index.js) de erro no Wasabi via IPC.
|
||||
// Throttle de 60s para não inundar o usuário num backlog grande.
|
||||
let lastWasabiErrorNotifyAt = 0;
|
||||
function notifyWasabiError(message) {
|
||||
if (!process.send) return;
|
||||
const now = Date.now();
|
||||
if (now - lastWasabiErrorNotifyAt < 60000) return;
|
||||
lastWasabiErrorNotifyAt = now;
|
||||
process.send({ event: 'wasabi-error', message });
|
||||
}
|
||||
|
||||
// Enviar imagem para o servidor via Socket.IO e aguardar confirmação
|
||||
function sendImageToServer(filePath, isBacklog, bypassCache = false) {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
@@ -1440,10 +1457,12 @@ function sendImageToServer(filePath, isBacklog, bypassCache = false) {
|
||||
|
||||
} catch (uploadErr) {
|
||||
addLog(`❌ Falha no Direct Upload: ${uploadErr.message}. Tentando via VPS...`);
|
||||
notifyWasabiError(`Falha no upload direto ao Wasabi: ${uploadErr.message}. Usando envio via VPS como alternativa.`);
|
||||
fallbackUpload();
|
||||
}
|
||||
} else {
|
||||
addLog(`ℹ️ Wasabi não disponível no servidor. Usando envio padrão via VPS.`);
|
||||
notifyWasabiError(`Wasabi indisponível no servidor. Imagens sendo enviadas via VPS (mais lento).`);
|
||||
fallbackUpload();
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user