Criar atendimento on-line

23 respostas
M

Olá pessoal,

Estou precisando criar um atendimento on-line para a empresa onde trabalho.


O Funcionamento seria o seguinte:

Cliente:
1 - Clica no link para o atendimento.
2 - Se existir algum atendente livre, a conversa se inicia.
3 - Se não existir atendentes livres, o cliente entra numa fila de espera.
4 - O sistema informa quantas pessoas estão aguardando antes do cliente.

Atendente:
1 - Quando um cliente chama, o sistema adiciona esse cliente em uma fila de clientes.
2 - O atendente deverá atender apenas um cliente por vez.
3 - Quando o atendente estiver livre, os sistema responde automaticamente para o cliente, com uma mensagem inicial de saudação.

Geral:
1 - O cliente entra com um nome e e-mail.
2 - Ao final, o sistema envia a conversa por e-mail caso o cliente solicite.


Já faz alguns dias que estou pesquisando no google: java, chat, atendimento … Enfim, não consegui encontrar um tutorial.
Na realidade, vi que o guj tem um tutorial, mas não consegui entender muito bem.

Prá falar a verdade, estou perdida. :oops:

Então, decidi postar este tópico perguntando se alguém tem algum tutorial e pode me enviar ou se alguém conhece algum link que por um acaso eu tenha deixado passar …

Desde já agradeço qualquer ajuda!
Valeu pessoal.
Mariane

23 Respostas

alanbrasil1984

seu eu fosse vc ao invés de procurar tutorial, cairia dentro no desenvolvimento dele…

pq até se vc achar um bom tutorial vc iria poder se perder e pelo oque pode se ver vc esta bem a parte da documentação do seu projeto.

acho que até servlet puro da pra fazer isso… rsrs brincadeira.

então mão na massa…

Att,

Alan Rodrigo.

Alexandre_Saudate

Quanto tempo você tem para entregar? Dependendo do seu tempo, podemos construir um juntos.

M

Olá asaudate,

Tudo bem?
Então, tenho um prazo bem longo… Posso fazer com tranquilidade.
Se puder me dar umas dicas, eu agradeço!

Obrigada pelo retorno pessoal!
Mariane

Ladim

Olá Mariane.
Se a necessidade for muito urgente, dá uma olhada nesses carinhas aqui: Atendimento Grátis e Ace Operator

http://www.ziggi.com.br/downloads/11161.asp

http://java-source.net/open-source/chat-servers/ace-operator

Caso você necessite de uma solução mais personalizada, segue a resposta do Alan: CAI DENTRO DO DESENVOLVIMENTO.
Vai levar um tempinho, mas garanto que não vai se arrepender. E conforme aparecerem as dúvidas o pessoal aqui do GUJ dá uma mão.

Até mais.

Alain

Alexandre_Saudate

Bom... comecemos pelo começo.

Você precisa de algumas classes de domínio.

Comece desenvolvendo:

class Cliente {
       //métodos para login e senha...
       private String login, senha;

       //getters e setters...
       //Sugestão: no setter da senha, inclua validação de quanto forte é a senha
}

class Atendente {
       private boolean ocupado;

       //getters e setters...

}

Isso vai num pacote modelo. Algo interessante de adicionar seria, também, uma outra classe de modelo (singleton) que armazene uma lista com os atendentes. Isso ficaria mais ou menos assim:

class Atendentes {
         
        private List<Atendente> atendentes = new ArrayList();
       
        private static Atendentes instance = new Atendentes();


        
        private Atendentes(){}

        public Atendentes getInstance() {
                return instance;
        }

        public List<Atendente> todosAtendentes() {
                return atendentes;

        }

        public List<Atendente> atendentesLivres() {
                     List<Atendente> retorno = new ArrayList();
                     for (Atendente atendente: atendentes) {
                                 if (!atendente.isOcupado())
                                          retorno.add(atendente);
                     }
                     return retorno;
        }

}

Tudo isso é modelo e mais uma fachada. Agora, você vai precisar dos controladores, que são servlets.
Antes de continuar, me fala se é mais ou menos isso que você precisa ou se tem algo "fora do lugar" por aí.

M

Olá asaudate,

Nossa! Obrigada.
É isso mesmo que estou precisando.

Vou ter que fazer o mesmo para cliente não vou?

A minha dúvida é a seguinte:
Como fazer a comunicação entre o cliente e o atendente e como implementar o método isOcupado().

Vou começar pelas classes sugeridas. :smiley:

Outra dúvida: É necessário armazenar em BD a conversa?

Obrigada mais uma vez!
Mariane Galhardo

Alexandre_Saudate

o isOcupado é o getter do atributo ocupado do atendente.

Para o cliente, você deve fazer algo parecido com a fachada de atendentes, mas com uma fila. Ou seja, fica assim:

class Clientes {

           private List<Cliente> clientes = new 

           private static Clientes instance = new Clientes();
       
           private Clientes(){}

           public static Clientes getInstance() {
                    return instance;
           }
           
           public void poeClienteNaFila (Cliente cliente)  {
                      clientes.offer(cliente);
            }
           
           public Cliente retiraClienteDaFila() {
                      return clientes.poll();
           }

Além disso, você precisa de uma classe para coordenar tudo isso :

public class AtendimentoFacade {

             private Atendentes atendentes;
             private Clientes clientes;

             public AtendimentoFacade() {
                        atendentes = Atendentes.getInstance();
                        clientes = Clientes.getInstance();
             }
}
Alexandre_Saudate

desculpe, tive que sair e não pude terminar o método.

Já continuo, um segundo

M

Olá asaudate,

Sem problemas, estou caminhando com o que você colocou.
Os métodos offer e poll eu tenho que implementar? Ou já existem prontos?

Obrigada,
Mariane

Alexandre_Saudate

Existem prontos. São métodos da interface Queue.

Alexandre_Saudate

Como passado por mensagem privada, abaixo está uma implementação parcial do sistema:

package modelo;

public class Atendente {
	
	private boolean ocupado;

	Atendente() {}
	
	public boolean isOcupado() {
		return ocupado;
	}

	public void setOcupado(boolean ocupado) {
		this.ocupado = ocupado;
	}

}
package modelo;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class Atendentes {
	
	private static Atendentes instance = new Atendentes();
	private BlockingQueue<Atendente> atendentesLivres = new LinkedBlockingQueue<Atendente>();
	private BlockingQueue<Atendente> todosAtendentes = new LinkedBlockingQueue<Atendente>();
	
	private Atendentes() {}
	
	public static Atendentes getInstance() {
		return instance;
	}
	
	public void adicionaAtendente(Atendente atendente) {
		if (!atendente.isOcupado())
			atendentesLivres.add(atendente);
		todosAtendentes.add(atendente);
	}
	
	public Atendente obtemAtendente() {
		return atendentesLivres.poll();
	}
	
	public void liberaAtendente(Atendente atendente) {
		atendentesLivres.offer(atendente);
	}
	
	public synchronized int getNumeroDeAtendentesLivres() {
		return atendentesLivres.size();
	}
	
	
	
	

}
package modelo;

import exceptions.SemAtendentesLivresException;

public class AtendimentoFacade {
	
	private Atendentes atendentes;
	private Clientes clientes;
	
	public AtendimentoFacade() {
		atendentes = Atendentes.getInstance();
		clientes = Clientes.getInstance();
	}
	
	public Chat obterAtendimento(Cliente cliente, Atendente atendente) throws SemAtendentesLivresException {
		if (atendentes.getNumeroDeAtendentesLivres() == 0)
			throw new SemAtendentesLivresException();
		return new Chat(cliente, atendente);
	}
	
	

}
package modelo;

import java.util.ArrayList;
import java.util.List;

public class Chat {
	
	private Cliente cliente;
	private Atendente atendente;
	private List<String> mensagens = new ArrayList<String>();
	
	public Chat(Cliente cliente, Atendente atendente) {
		this.cliente = cliente;
		this.atendente = atendente;
	}
	
	public void postarMensagem(String mensagem) {
		mensagens.add(mensagem);
	}
	
	public void editarMensagem (String novaMensagem, int messageId) {
		mensagens.add(messageId, novaMensagem);
		
	}

}
package modelo;

public class Cliente {
	
	private String login,senha;

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

}
package modelo;

public class Clientes {
	
	
	private static Clientes instance = new Clientes();
	
	private Clientes(){}
	
	public static Clientes getInstance() {
		return instance;
	}

}
package exceptions;

public class SemAtendentesLivresException extends Exception {

}
Alexandre_Saudate

Servlet controlador:

package controle;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import exceptions.SemAtendentesLivresException;

import modelo.Atendentes;
import modelo.AtendimentoFacade;
import modelo.Chat;
import modelo.Cliente;

 public class ObterChatServlet extends javax.servlet.http.HttpServlet{
    
	 
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 AtendimentoFacade facade = new AtendimentoFacade();
		 Atendentes atendentes = Atendentes.getInstance();
		 //TODO precisa ser alterado de modo que localize o cliente, ou coisa parecida
		 try {
			 Chat chat = facade.obterAtendimento(new Cliente(), atendentes.obtemAtendente());
			 request.getSession().setAttribute("chat", chat);
			 RequestDispatcher dispatcher = request.getRequestDispatcher("telaChat.jsp");
			 dispatcher.forward(request, response);
		 }
		 catch (SemAtendentesLivresException e) {
			 request.setAttribute("mensagem", e.getMessage());
			 RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
			 dispatcher.forward(request, response);
		 }
		 
	}		  	    
}

index.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Atendimento</title>
</head>
<body>
<% String mensagem = (String)request.getAttribute("mensagem");
   if (mensagem != null && !mensagem.equals("")) {
%>
	<%= mensagem %>
<%} %>
<br>
<a href="ObterChatServlet">Obter chat!</a>
</body>
</html>

Agora, está carregado na sessão um objeto Chat, que contém as referências para suas mensagens , o cliente e o atendente. O resto é mais simples, implementar um servlet controlador de chat que recupere essa sessão e faça as atualizações no objeto. Se tiver mais alguma dúvida, só falar...

M

Olá asaudate!

Nossa! MUITO obrigada pela ajuda! :smiley:
Vou tentar entender o código e colocar para funcionar aqui com algumas adaptações.

Assim que funcionar, posto uma resposta.

Obrigada mais uma vez.
Mariane

M

Oi asaudate,

Estou fazendo o chat e fiquei com algumas dúvidas.
Estou utilizando apenas JSP e servlets

Criei um servlet, que é chamado logo depois que o cliente fornece o nome e o e-mail.
Nesse servlet eu instancio uma classe clientes para adicionar o cliente que acabou de entrar no atendimento on-line.
Eu devo setar esse cliente na sessao?

Como faço para definir se a pessoa que está entrando no sistema é um cliente ou um atendente? No mesmo servlet?

Aguardo seu retorno.
Obrigada,
Mariane

Gu1

desculpa invadir assim mas também preciso desenvolver um atendimento on-line, sendo assim, copie o codigo que o nosso colega asaudade postou aqui, esta tudo certinho como foi colocado aqui no post, tudo compilado e funfando, mas estou com um probleminha, o que seria esse controlador servlet que tem que criar, dei uma pesquisa no google e não achei nada que possa me ajudar, se por um acaso alguem puder me ajudar ficarei grato… enquanto isso vou quebrando a cabeça aqui…

valew…

Alexandre_Saudate

O servlet controlador é um elemento de arquitetura MVC. M-> Modelo , V-> View, C-> Controlador (o servlet).

Adianto que o sistema que postei não foi finalizado, ficou com algumas pendências. Caso você queira, nós podemos finalizar estas pendências.

Emerson_Macedo

Mariane,

Existe um software open source bem falado em PHP que acredito atender o que você precise. http://www.craftysyntax.com/

Caso tenha mesmo que ser em Java, então não conheço nada para indicar.

[]s

Gu1

bom dia asaudate… tipo se der para fazer isso eu iria ficar muito grato, não porque eu não queira por a mão na massa, mas sim pelo motivo que eu não sei nem como eu faço isso asaudate, faz pouco tempo que trabalho com java e tem alguns assuntos que ainda não sei… então se der para vc fazer esse favor… ficarei muito grato… mas muito grato mesmo… enquanto isso vou procurar saber o que é esse MVC…

valew asaudate…

P

olá! Você conseguiu concluir o sistema web de atendimento por chat?
Resultou em elguns erros. Existe a possibilidade de enviarem o fonte
por email? [email removido]

Agradeço.

P

Ola! Tive alguns erros e não consegui deixar funcionando.
Vocês podem me enviar por e-mail o fonte deste sistema de atendimento online por chat?
[email removido]

Agradeço.

rfgallon

Pessoal, eu procurando um sistema de atendimento e vi as msgs de vocês.
Por acaso conseguiram terminar este projeto?

luistiagos

pq não se baseia por um pronto open source? assim vc não precisara re-inventar a roda quadrada… vai la em www.sourceforge.net e busque por chat ou web chat aposto que vai achar varios bons chats… porem se quiser mesmo fazer um do 0 faça um generico para onde vc possa adaptalo aonde vc quiser

rfgallon

luistiagos, já andei procurando e dificilmente acha-se chats escritos em java.
Mas vou procurar um pouco mais.

Obrigado

Criado 25 de março de 2008
Ultima resposta 15 de jan. de 2009
Respostas 23
Participantes 9