Sistema de ServiçosJavaFX
Diagrama de Classe
Classe Enum Prioridade
No pacote br.com.clayton.sistemadeservicos.enuns
, temos a enum
Prioridade
, que representa três níveis de prioridade: Baixa, Média e Alta. Essa estrutura é importante para categorizarmos o nível de urgência de um determinado serviço ou tarefa dentro do sistema de serviços.
Abaixo, vamos detalhar cada parte da classe Prioridade
:
package br.com.clayton.sistemadeservicos.enuns;
public enum Prioridade {
BAIXA(0, "Baixa"),
MEDIA(1, "Média"),
ALTA(2, "Alta");
private Integer codigo;
private String descricao;
private Prioridade(Integer codigo, String descricao) {
this.codigo = codigo;
this.descricao = descricao;
}
public Integer getCodigo() {
return codigo;
}
public String getDescricao() {
return descricao;
}
public static Prioridade toEnum(Integer cod) {
if (cod == null) {
return null;
}
for (Prioridade prioridade : Prioridade.values()) {
if (cod.equals(prioridade.getCodigo())) {
return prioridade;
}
}
throw new IllegalArgumentException("Prioridade inválida");
}
}
Explicação do Código
Definição dos Valores da Enum:
- A enum define três constantes:
BAIXA
,MEDIA
, eALTA
, cada uma com um código e uma descrição. - Por exemplo,
BAIXA(0, "Baixa")
significa que o nível de prioridade “Baixa” possui o código0
e a descrição"Baixa"
. Os códigos ajudam a referenciar esses valores em banco de dados ou na lógica de programação de forma simplificada.
- A enum define três constantes:
Atributos:
codigo
: O código numérico associado à prioridade.descricao
: O texto descritivo associado à prioridade.
Construtor:
- O construtor
Prioridade(Integer codigo, String descricao)
define como cada instância da enum será criada, aceitando umcodigo
e umadescricao
para inicializar as constantes.
- O construtor
Métodos Acessores (
getCodigo
egetDescricao
):getCodigo
: Retorna o código da prioridade.getDescricao
: Retorna a descrição da prioridade.
Método
toEnum(Integer cod)
:- Esse método converte um código
Integer
em uma instância da enumPrioridade
. Ele verifica cada constante da enum para ver se o código coincide com o fornecido. Se não encontrar uma correspondência, lança uma exceçãoIllegalArgumentException
com a mensagem “Prioridade inválida”.
- Esse método converte um código
Classe Enum Status
package br.com.clayton.sistemadeservicos.enuns;
public enum Status {
ABERTO(0, "Aberto"),
ANDAMENTO(1, "Andamento"),
ENCERRADO(2, "Encerrado");
private Integer codigo;
private String descricao;
private Status(Integer codigo, String descricao) {
this.codigo = codigo;
this.descricao = descricao;
}
public Integer getCodigo() {
return codigo;
}
public String getDescricao() {
return descricao;
}
public static Status toEnum(Integer cod) {
if (cod == null) {
return null;
}
for (Status status : Status.values()) {
if (cod.equals(status.getCodigo())) {
return status;
}
}
throw new IllegalArgumentException("Status inválido");
}
}
Detalhes do Código
Definição dos Valores da Enum:
- Cada constante (
ABERTO
,ANDAMENTO
,ENCERRADO
) representa um estado de um serviço, com um código numérico e uma descrição textual. - Por exemplo,
ABERTO(0, "Aberto")
define que o estado “Aberto” possui o código0
e a descrição"Aberto"
.
- Cada constante (
Atributos:
codigo
: Número associado ao estado.descricao
: Descrição do estado.
Construtor:
Status(Integer codigo, String descricao)
: Construtor que inicializa cada constante com um código e uma descrição.
Métodos Acessores (
getCodigo
egetDescricao
):getCodigo()
: Retorna o código do status.getDescricao()
: Retorna a descrição do status.
Método
toEnum(Integer cod)
:- Converte um código inteiro em uma instância de
Status
, retornando a constante correspondente ou lançando uma exceçãoIllegalArgumentException
se o código for inválido.
- Converte um código inteiro em uma instância de
Dicas Para a Criação da Classe Cliente
Para a continuação do projeto, você irá desenvolver a implementação da entidade Cliente com base no modelo apresentado para a classe Técnico, considerando as diferenças específicas da classe Cliente. Siga os seguintes passos para completar a implementação:
Tarefas:
XML (View):
- Crie o arquivo XML para a tela de Cadastro de Cliente. Esta tela deve conter os campos específicos para um Cliente.
- Atente-se para os campos únicos de Cliente e adapte conforme necessário.
Controller:
- Implemente o ClienteController para gerenciar as interações entre a view (XML) e o modelo Cliente.
- Este controller deve permitir a criação, atualização, remoção e listagem de clientes.
Model:
- Desenvolva a classe Cliente no modelo, herdando de Pessoa, como indicado no diagrama de classes.
DTO (Data Transfer Object):
- Crie o ClienteDTO para transferir dados da classe Cliente de forma simplificada entre as camadas do sistema.
- Mapeie os atributos específicos de Cliente e adapte o ClienteDTO para atender às necessidades do sistema.
DAO (Data Access Object):
- Implemente o ClienteDAO para gerenciar o acesso e a persistência dos dados dos Clientes.
- Garanta que os métodos de criação, leitura, atualização e exclusão estejam de acordo com os requisitos da aplicação.
Service:
- Desenvolva a camada de ClienteService, onde serão implementadas as regras de negócios relacionadas aos Clientes.
- Certifique-se de que as operações da camada de serviço respeitem as regras de negócio da entidade Cliente.
Dicas Para a Criação da Classe Chamado
Dando continuidade à estrutura do sistema, você deve implementar a classe Chamado
seguindo as mesmas diretrizes de criação das camadas de XML, Controller, Model, DTO, DAO e Service, conforme apresentado na implementação de Tecnico
.
Instruções
Modelagem das Camadas:
- Utilize as mesmas camadas apresentadas na implementação de
Tecnico
para desenvolver a estrutura deChamado
. Cada camada deve ser implementada separadamente, mantendo o padrão arquitetural definido.
- Utilize as mesmas camadas apresentadas na implementação de
Campos Específicos da Classe
Chamado
:- Ao implementar, observe que a classe
Chamado
possui atributos específicos:prioridade
(do tipoPrioridade
– Enum),status
(do tipoStatus
– Enum),titulo
(String),observacoes
(String),tecnico
ecliente
(associações comTecnico
eCliente
).
- Implemente o DTO considerando esses atributos, e defina corretamente o tipo de cada campo.
- Ao implementar, observe que a classe
Método de Encerramento do Chamado:
- Diferente das demais classes,
Chamado
não deve permitir exclusão. Em vez disso, você deve implementar um método de fechamento do chamado. - Esse método deve:
- Alterar o
status
para o valor que indica o encerramento. - Definir a
dataFechamento
para a data atual apenas quando o chamado for fechado.
- Alterar o
- Diferente das demais classes,
Observações sobre a Classe
ChamadoService
:- Na camada de
Service
, siga a estrutura deChamadoService
para lidar com as operações defindAll
,findById
,create
eupdate
. - O método
update
deve atualizar o chamado com os dados doDTO
e verificar se ostatus
do chamado é de fechamento, para definir adataFechamento
adequadamente. - Implemente o método
newChamado
naService
para instanciar um novo objetoChamado
a partir do DTO e configurar todas as associações e enums.
- Na camada de
- Incluir lista de
Chamado
nas ClassesTecnico
eCliente
Nas classes
Cliente
eTecnico
permite que o sistema estabeleça um relacionamento bidirecional entre essas classes e a entidadeChamado
. Isso significa que cadaCliente
e cadaTecnico
podem ter uma lista de chamados associada a eles, e a entidadeChamado
contém uma referência aoCliente
e aoTecnico
que estão atendendo a esse chamado.Explicação do Relacionamento e da Necessidade de Adicionar o Campo
Relacionamento Bidirecional:
Ao adicionar a lista deChamado
nas classesCliente
eTecnico
, o sistema permite navegar de umCliente
ouTecnico
diretamente para os chamados associados. Esse tipo de navegação é útil em várias operações, como:- Exibir todos os chamados de um
Cliente
específico. - Obter os chamados que um determinado
Tecnico
está atendendo.
- Exibir todos os chamados de um
Desempenho e Flexibilidade:
Esse relacionamento permite uma consulta direta sem necessidade de buscas adicionais no banco de dados. Com a lista de chamados emCliente
eTecnico
, o sistema consegue melhorar a performance ao evitar buscas complexas.Controle e Manutenção de Chamados:
Quando o sistema de chamados é bidirecional, é mais fácil gerenciar o ciclo de vida de umChamado
dentro de cada cliente ou técnico. Além disso, isso ajuda a manter a consistência dos dados e facilita a implementação de regras de negócios, como a listagem de chamados ainda em aberto ou de alta prioridade.
Exemplo de Implementação
Aqui está a implementação com a adição da lista
chamados
nas classesCliente
eTecnico
:
Classe Cliente
:
public class Cliente extends Pessoa {
private List chamados = new ArrayList<>();
// Construtores e métodos...
public List getChamados() {
return chamados;
}
public void setChamados(List chamados) {
this.chamados = chamados;
}
}
Classe Tecnico
:
public class Tecnico extends Pessoa {
private static final long serialVersionUID = 1L;
private List chamados = new ArrayList<>();
// Construtores e métodos...
public List getChamados() {
return chamados;
}
public void setChamados(List chamados) {
this.chamados = chamados;
}
}