adicionado funcionalidade para checar se já possui um atendimento em andamento
This commit is contained in:
parent
69ad98af95
commit
8eed72c15b
162
main.js
162
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 path = require('path');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
|
||||||
|
|
@ -67,8 +67,9 @@ async function getDataAndUpdateFloatingBtn (){
|
||||||
|
|
||||||
const proximos = JSON.parse(await floatingWin.webContents.executeJavaScript("localStorage.getItem('proximos')"));
|
const proximos = JSON.parse(await floatingWin.webContents.executeJavaScript("localStorage.getItem('proximos')"));
|
||||||
let count = proximos.length;
|
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
|
// Ouvir pedido para mostrar a janela principal
|
||||||
ipcMain.on('chamar-fila', async () => {
|
ipcMain.on('chamar-fila', async () => {
|
||||||
|
|
||||||
if (mainWin) {
|
const countFila = async () => {
|
||||||
if (!mainWin.isVisible()) {
|
const proximos = JSON.parse(await floatingWin.webContents.executeJavaScript("localStorage.getItem('proximos')"));
|
||||||
mainWin.show();
|
return proximos.length;
|
||||||
mainWin.focus();
|
|
||||||
} else {
|
|
||||||
mainWin.focus();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
createMainWindow(); // Cria se não existir
|
|
||||||
mainWin.webContents.on('did-finish-load', () => {
|
|
||||||
mainWin.show();
|
|
||||||
mainWin.focus();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const colabId = await getSelectedOperatorId();
|
const requestData = async () =>{
|
||||||
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({
|
if (mainWin) {
|
||||||
method: 'GET',
|
if (!mainWin.isVisible()) {
|
||||||
url: url,
|
mainWin.show();
|
||||||
headers: {
|
mainWin.focus();
|
||||||
'Content-Type': 'application/json',
|
} else {
|
||||||
'Authorization': 'Bearer ' + token
|
mainWin.focus();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
createMainWindow(); // Cria se não existir
|
||||||
|
mainWin.webContents.on('did-finish-load', () => {
|
||||||
|
mainWin.show();
|
||||||
|
mainWin.focus();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
request.on('response', (response) => {
|
|
||||||
let rawData = '';
|
|
||||||
|
|
||||||
response.on('data', (chunk) => {
|
const colabId = await getSelectedOperatorId();
|
||||||
rawData += chunk;
|
const token = await getAuthToken('token');
|
||||||
});
|
const url = apiUrl + 'chama-fila-app-colab/'+colabId; // URL de exemplo para enviar a solicitação
|
||||||
|
|
||||||
response.on('end', () => {
|
const request = net.request({
|
||||||
try {
|
method: 'GET',
|
||||||
const parsedData = JSON.parse(rawData);
|
url: url,
|
||||||
|
headers: {
|
||||||
if (response.statusCode === 200) {
|
'Content-Type': 'application/json',
|
||||||
mainWin.webContents.send('select-atend-id', parsedData.data);
|
'Authorization': 'Bearer ' + token
|
||||||
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) => {
|
request.on('response', (response) => {
|
||||||
console.error("Erro na requisição:", error);
|
let rawData = '';
|
||||||
mainWin.webContents.send('api-error', {
|
|
||||||
message: `Erro ao chamar atendimento: ${error.message}`
|
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.end();
|
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();
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
requestData();
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "autoatendcolab",
|
"name": "autoatendcolab",
|
||||||
"version": "1.0.6",
|
"version": "1.0.7",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"isBuildNow": true,
|
"isBuildNow": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
||||||
//inicia o atendimento atual
|
//inicia o atendimento atual
|
||||||
iniciaAtendimento: (itemId) => ipcRenderer.send('iniciar-atendimento', itemId),
|
iniciaAtendimento: (itemId) => ipcRenderer.send('iniciar-atendimento', itemId),
|
||||||
|
|
||||||
|
showObservation: (callback) => ipcRenderer.on('show-observation', (_event) => callback() ),
|
||||||
//salva a observação do atendimento
|
//salva a observação do atendimento
|
||||||
saveObservation: (data) => ipcRenderer.send('save-observation', data),
|
saveObservation: (data) => ipcRenderer.send('save-observation', data),
|
||||||
|
|
||||||
|
|
|
||||||
52
renderer.js
52
renderer.js
|
|
@ -17,6 +17,7 @@ let selectedItemId = null;
|
||||||
let selectedItemName = '';
|
let selectedItemName = '';
|
||||||
|
|
||||||
window.electronAPI.onLoadData((data) => {
|
window.electronAPI.onLoadData((data) => {
|
||||||
|
nextButton.disabled = true;
|
||||||
if(!data){
|
if(!data){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -75,6 +76,7 @@ initializePusher();
|
||||||
|
|
||||||
//chama o proximo da fila ao abrir a janela de atendimentos
|
//chama o proximo da fila ao abrir a janela de atendimentos
|
||||||
window.electronAPI.selectAtendID((data)=>{
|
window.electronAPI.selectAtendID((data)=>{
|
||||||
|
nextButton.disabled = true;
|
||||||
if(!data){
|
if(!data){
|
||||||
queueNumber.innerHTML = 'Ninguem aguardando atendimento, fechando a janela em alguns segundos...';
|
queueNumber.innerHTML = 'Ninguem aguardando atendimento, fechando a janela em alguns segundos...';
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
|
@ -83,14 +85,17 @@ window.electronAPI.selectAtendID((data)=>{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Reseta a view para a lista sempre que os dados são carregados ao clicar no botão para abrir a janela
|
// 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);
|
populateList(data);
|
||||||
showListView();
|
showListView();
|
||||||
selectedItemId = data.id ?? null;
|
selectedItemId = data.id ?? null;
|
||||||
//data.senhaGen
|
//data.senhaGen
|
||||||
queueNumber.innerHTML = data ? `NA VEZ: <u>${data.clientName.toUpperCase()}</u> - ${data.descricaoServico.toUpperCase()}` : 'Ninguem aguardando atendimento';
|
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';
|
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
|
// Função para popular a lista de itens
|
||||||
|
|
@ -99,28 +104,28 @@ function populateList(currentData) {
|
||||||
|
|
||||||
// Adiciona os outros itens apenas para visualização (opcional)
|
// Adiciona os outros itens apenas para visualização (opcional)
|
||||||
const proximos = JSON.parse(datastorage);
|
const proximos = JSON.parse(datastorage);
|
||||||
var count = 8;
|
// var count = 6;
|
||||||
|
|
||||||
itemList.innerHTML = ''; // Limpa a lista anterior
|
// itemList.innerHTML = ''; // Limpa a lista anterior
|
||||||
if (!proximos || proximos.length === 0 || !currentData) {
|
|
||||||
itemList.innerHTML = '<li>Fila vazia!</li>';
|
// const dec_counter = setInterval(() => {
|
||||||
const dec_counter = setInterval(() => {
|
// --count;
|
||||||
count = count -1;
|
// counterStart.innerHTML = `[ ${count} ]`;
|
||||||
counterStart.innerHTML = `[ ${count} ]`;
|
// if (count <= 0) {
|
||||||
if (count <= 0 || !currentData) {
|
// counterStart.innerHTML = '';
|
||||||
counterStart.innerHTML = '';
|
// nextButton.disabled = !currentData;
|
||||||
nextButton.disabled = false;
|
// clearInterval(dec_counter);
|
||||||
clearInterval(dec_counter);
|
// }
|
||||||
}
|
// },1000);
|
||||||
},1000);
|
|
||||||
return;
|
setTimeout(()=>{
|
||||||
}
|
nextButton.disabled = !currentData;
|
||||||
|
},5000);
|
||||||
|
|
||||||
// Seleciona o primeiro item por padrão (ou o próximo disponível)
|
// Seleciona o primeiro item por padrão (ou o próximo disponível)
|
||||||
// Aqui, vamos apenas pegar o primeiro da lista atual
|
// Aqui, vamos apenas pegar o primeiro da lista atual
|
||||||
const itemToProcess = proximos[0]; // Pega o primeiro item
|
const itemToProcess = proximos[0]; // Pega o primeiro item
|
||||||
if (itemToProcess) {
|
if (itemToProcess) {
|
||||||
|
|
||||||
selectedItemId = itemToProcess.id;
|
selectedItemId = itemToProcess.id;
|
||||||
selectedItemName = itemToProcess.clientName;
|
selectedItemName = itemToProcess.clientName;
|
||||||
const li = document.createElement('li');
|
const li = document.createElement('li');
|
||||||
|
|
@ -128,20 +133,9 @@ function populateList(currentData) {
|
||||||
li.dataset.id = itemToProcess.id; // Armazena o ID no elemento
|
li.dataset.id = itemToProcess.id; // Armazena o ID no elemento
|
||||||
li.classList.add('selected'); // Marca como selecionado visualmente (precisa de CSS)
|
li.classList.add('selected'); // Marca como selecionado visualmente (precisa de CSS)
|
||||||
itemList.appendChild(li);
|
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 {
|
} else {
|
||||||
itemList.innerHTML = '<li>Fila vazia!</li>';
|
itemList.innerHTML = '<li>Fila vazia!</li>';
|
||||||
nextButton.disabled = !currentData;
|
nextButton.disabled = true;
|
||||||
selectedItemId = null;
|
selectedItemId = null;
|
||||||
selectedItemName = '';
|
selectedItemName = '';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue