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

A

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.

A

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

L

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

A

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

A

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();
             }
}
A

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

A

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

A

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 {

}
A

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

G

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…

A

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.

E

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

G

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.

R

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

L

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

R

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