adicionado funcionalidade para checar se já possui um atendimento em andamento
This commit is contained in:
parent
69ad98af95
commit
8eed72c15b
176
main.js
176
main.js
|
|
@ -1,4 +1,4 @@
|
|||
const { app, BrowserWindow, ipcMain, screen, net } = require('electron');
|
||||
const { app, BrowserWindow, ipcMain, screen, net, dialog } = require('electron');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
|
|
@ -67,8 +67,9 @@ async function getDataAndUpdateFloatingBtn (){
|
|||
|
||||
const proximos = JSON.parse(await floatingWin.webContents.executeJavaScript("localStorage.getItem('proximos')"));
|
||||
let count = proximos.length;
|
||||
//lista a contagem no botão flutuante
|
||||
floatingWin.webContents.send('update-count', count);
|
||||
|
||||
//lista a contagem no botão flutuante
|
||||
floatingWin.webContents.send('update-count', count);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -392,72 +393,119 @@ ipcMain.handle('get-count', async () => {
|
|||
// Ouvir pedido para mostrar a janela principal
|
||||
ipcMain.on('chamar-fila', async () => {
|
||||
|
||||
if (mainWin) {
|
||||
if (!mainWin.isVisible()) {
|
||||
mainWin.show();
|
||||
mainWin.focus();
|
||||
const countFila = async () => {
|
||||
const proximos = JSON.parse(await floatingWin.webContents.executeJavaScript("localStorage.getItem('proximos')"));
|
||||
return proximos.length;
|
||||
}
|
||||
|
||||
const requestData = async () =>{
|
||||
|
||||
if (mainWin) {
|
||||
if (!mainWin.isVisible()) {
|
||||
mainWin.show();
|
||||
mainWin.focus();
|
||||
} else {
|
||||
mainWin.focus();
|
||||
}
|
||||
} else {
|
||||
mainWin.focus();
|
||||
createMainWindow(); // Cria se não existir
|
||||
mainWin.webContents.on('did-finish-load', () => {
|
||||
mainWin.show();
|
||||
mainWin.focus();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
createMainWindow(); // Cria se não existir
|
||||
mainWin.webContents.on('did-finish-load', () => {
|
||||
mainWin.show();
|
||||
mainWin.focus();
|
||||
|
||||
|
||||
const colabId = await getSelectedOperatorId();
|
||||
const token = await getAuthToken('token');
|
||||
const url = apiUrl + 'chama-fila-app-colab/'+colabId; // URL de exemplo para enviar a solicitação
|
||||
|
||||
const request = net.request({
|
||||
method: 'GET',
|
||||
url: url,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': 'Bearer ' + token
|
||||
}
|
||||
});
|
||||
|
||||
request.on('response', (response) => {
|
||||
let rawData = '';
|
||||
|
||||
response.on('data', (chunk) => {
|
||||
rawData += chunk;
|
||||
});
|
||||
|
||||
response.on('end', () => {
|
||||
try {
|
||||
const parsedData = JSON.parse(rawData);
|
||||
|
||||
if (response.statusCode === 200) {
|
||||
mainWin.webContents.send('select-atend-id', parsedData.data);
|
||||
if(parsedData.data.Status === 'Atendendo'){
|
||||
let options2 = {
|
||||
'title': 'Precisa finalizar antes de chamar o próximo.',
|
||||
'message': 'Em andamento',
|
||||
'detail': 'Já possui um atendimento em andamento (Chamado/Atendendo), continue e finalize por favor!',
|
||||
'type': 'error',
|
||||
'noLink': true,
|
||||
'buttons': ['Depois','Continuar'],
|
||||
};
|
||||
dialog.showMessageBox(floatingWin, options2).then(result => {
|
||||
if(result.response){
|
||||
mainWin.webContents.send('show-observation');
|
||||
};
|
||||
});
|
||||
}
|
||||
// console.log(parsedData);
|
||||
} else {
|
||||
console.error(`Erro na requisição: Status code ${response.statusCode}`, parsedData);
|
||||
// Lidar com o erro adequadamente, talvez enviando uma mensagem para a janela principal
|
||||
mainWin.webContents.send('api-error', {
|
||||
message: `Erro ao chamar atendimento: ${parsedData.message || 'Erro desconhecido'}`
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erro ao analisar a resposta JSON:", error);
|
||||
mainWin.webContents.send('api-error', {
|
||||
message: `Erro ao processar resposta do servidor.`
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
request.on('error', (error) => {
|
||||
console.error("Erro na requisição:", error);
|
||||
mainWin.webContents.send('api-error', {
|
||||
message: `Erro ao chamar atendimento: ${error.message}`
|
||||
});
|
||||
});
|
||||
|
||||
request.end();
|
||||
};
|
||||
|
||||
|
||||
|
||||
let options = {
|
||||
'title': 'Incie o atendimento quando o cliente chegar na sala.',
|
||||
'message': 'Chamar um cliente da fila?',
|
||||
'type': 'warning',
|
||||
'noLink': true,
|
||||
'buttons': ['Não','Sim'],
|
||||
};
|
||||
|
||||
|
||||
if(await countFila() > 0){
|
||||
dialog.showMessageBox(floatingWin, options).then(result => {
|
||||
if(result.response){
|
||||
requestData();
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
const colabId = await getSelectedOperatorId();
|
||||
const token = await getAuthToken('token');
|
||||
const url = apiUrl + 'chama-fila-app-colab/'+colabId; // URL de exemplo para enviar a solicitação
|
||||
|
||||
const request = net.request({
|
||||
method: 'GET',
|
||||
url: url,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': 'Bearer ' + token
|
||||
}
|
||||
});
|
||||
|
||||
request.on('response', (response) => {
|
||||
let rawData = '';
|
||||
|
||||
response.on('data', (chunk) => {
|
||||
rawData += chunk;
|
||||
});
|
||||
|
||||
response.on('end', () => {
|
||||
try {
|
||||
const parsedData = JSON.parse(rawData);
|
||||
|
||||
if (response.statusCode === 200) {
|
||||
mainWin.webContents.send('select-atend-id', parsedData.data);
|
||||
console.log(parsedData);
|
||||
} else {
|
||||
console.error(`Erro na requisição: Status code ${response.statusCode}`, parsedData);
|
||||
// Lidar com o erro adequadamente, talvez enviando uma mensagem para a janela principal
|
||||
mainWin.webContents.send('api-error', {
|
||||
message: `Erro ao chamar atendimento: ${parsedData.message || 'Erro desconhecido'}`
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erro ao analisar a resposta JSON:", error);
|
||||
mainWin.webContents.send('api-error', {
|
||||
message: `Erro ao processar resposta do servidor.`
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
request.on('error', (error) => {
|
||||
console.error("Erro na requisição:", error);
|
||||
mainWin.webContents.send('api-error', {
|
||||
message: `Erro ao chamar atendimento: ${error.message}`
|
||||
});
|
||||
});
|
||||
|
||||
request.end();
|
||||
else {
|
||||
requestData();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "autoatendcolab",
|
||||
"version": "1.0.6",
|
||||
"version": "1.0.7",
|
||||
"main": "main.js",
|
||||
"isBuildNow": true,
|
||||
"scripts": {
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
|||
//inicia o atendimento atual
|
||||
iniciaAtendimento: (itemId) => ipcRenderer.send('iniciar-atendimento', itemId),
|
||||
|
||||
showObservation: (callback) => ipcRenderer.on('show-observation', (_event) => callback() ),
|
||||
//salva a observação do atendimento
|
||||
saveObservation: (data) => ipcRenderer.send('save-observation', data),
|
||||
|
||||
|
|
|
|||
52
renderer.js
52
renderer.js
|
|
@ -17,6 +17,7 @@ let selectedItemId = null;
|
|||
let selectedItemName = '';
|
||||
|
||||
window.electronAPI.onLoadData((data) => {
|
||||
nextButton.disabled = true;
|
||||
if(!data){
|
||||
return;
|
||||
}
|
||||
|
|
@ -75,6 +76,7 @@ initializePusher();
|
|||
|
||||
//chama o proximo da fila ao abrir a janela de atendimentos
|
||||
window.electronAPI.selectAtendID((data)=>{
|
||||
nextButton.disabled = true;
|
||||
if(!data){
|
||||
queueNumber.innerHTML = 'Ninguem aguardando atendimento, fechando a janela em alguns segundos...';
|
||||
setTimeout(() => {
|
||||
|
|
@ -83,14 +85,17 @@ window.electronAPI.selectAtendID((data)=>{
|
|||
return;
|
||||
}
|
||||
// Reseta a view para a lista sempre que os dados são carregados ao clicar no botão para abrir a janela
|
||||
nextButton.disabled = true;
|
||||
populateList(data);
|
||||
showListView();
|
||||
selectedItemId = data.id ?? null;
|
||||
//data.senhaGen
|
||||
queueNumber.innerHTML = data ? `NA VEZ: <u>${data.clientName.toUpperCase()}</u> - ${data.descricaoServico.toUpperCase()}` : 'Ninguem aguardando atendimento';
|
||||
selectedItemNameSpan.innerHTML = data ? `<u> ${data.clientName.toUpperCase()} </u> <i style="float:right;">[ ${data.senhaGen} ]</i>` : 'Ninguem aguardando atendimento';
|
||||
});
|
||||
|
||||
window.electronAPI.showObservation(()=>{
|
||||
window.electronAPI.iniciaAtendimento(selectedItemId);
|
||||
showObservationView(); // Muda para a tela de observação
|
||||
});
|
||||
|
||||
// Função para popular a lista de itens
|
||||
|
|
@ -99,28 +104,28 @@ function populateList(currentData) {
|
|||
|
||||
// Adiciona os outros itens apenas para visualização (opcional)
|
||||
const proximos = JSON.parse(datastorage);
|
||||
var count = 8;
|
||||
// var count = 6;
|
||||
|
||||
itemList.innerHTML = ''; // Limpa a lista anterior
|
||||
if (!proximos || proximos.length === 0 || !currentData) {
|
||||
itemList.innerHTML = '<li>Fila vazia!</li>';
|
||||
const dec_counter = setInterval(() => {
|
||||
count = count -1;
|
||||
counterStart.innerHTML = `[ ${count} ]`;
|
||||
if (count <= 0 || !currentData) {
|
||||
counterStart.innerHTML = '';
|
||||
nextButton.disabled = false;
|
||||
clearInterval(dec_counter);
|
||||
}
|
||||
},1000);
|
||||
return;
|
||||
}
|
||||
// itemList.innerHTML = ''; // Limpa a lista anterior
|
||||
|
||||
// const dec_counter = setInterval(() => {
|
||||
// --count;
|
||||
// counterStart.innerHTML = `[ ${count} ]`;
|
||||
// if (count <= 0) {
|
||||
// counterStart.innerHTML = '';
|
||||
// nextButton.disabled = !currentData;
|
||||
// clearInterval(dec_counter);
|
||||
// }
|
||||
// },1000);
|
||||
|
||||
setTimeout(()=>{
|
||||
nextButton.disabled = !currentData;
|
||||
},5000);
|
||||
|
||||
// Seleciona o primeiro item por padrão (ou o próximo disponível)
|
||||
// Aqui, vamos apenas pegar o primeiro da lista atual
|
||||
const itemToProcess = proximos[0]; // Pega o primeiro item
|
||||
if (itemToProcess) {
|
||||
|
||||
selectedItemId = itemToProcess.id;
|
||||
selectedItemName = itemToProcess.clientName;
|
||||
const li = document.createElement('li');
|
||||
|
|
@ -128,20 +133,9 @@ function populateList(currentData) {
|
|||
li.dataset.id = itemToProcess.id; // Armazena o ID no elemento
|
||||
li.classList.add('selected'); // Marca como selecionado visualmente (precisa de CSS)
|
||||
itemList.appendChild(li);
|
||||
|
||||
const dec_counter = setInterval(() => {
|
||||
count = count -1;
|
||||
counterStart.innerHTML = `[ ${count} ]`;
|
||||
if (count <= 0 && currentData) {
|
||||
counterStart.innerHTML = '';
|
||||
nextButton.disabled = false;
|
||||
clearInterval(dec_counter);
|
||||
}
|
||||
},1000);
|
||||
|
||||
} else {
|
||||
itemList.innerHTML = '<li>Fila vazia!</li>';
|
||||
nextButton.disabled = !currentData;
|
||||
nextButton.disabled = true;
|
||||
selectedItemId = null;
|
||||
selectedItemName = '';
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue