

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ódigo0e 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 umcodigoe umadescricaopara inicializar as constantes.
- O construtor
Métodos Acessores (
getCodigoegetDescricao):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
Integerem 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çãoIllegalArgumentExceptioncom 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ódigo0e 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 (
getCodigoegetDescricao):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çãoIllegalArgumentExceptionse 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
Tecnicopara 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
Chamadopossui atributos específicos:prioridade(do tipoPrioridade– Enum),status(do tipoStatus– Enum),titulo(String),observacoes(String),tecnicoecliente(associações comTecnicoeCliente).
- 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,
Chamadonão deve permitir exclusão. Em vez disso, você deve implementar um método de fechamento do chamado. - Esse método deve:
- Alterar o
statuspara o valor que indica o encerramento. - Definir a
dataFechamentopara 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 deChamadoServicepara lidar com as operações defindAll,findById,createeupdate. - O método
updatedeve atualizar o chamado com os dados doDTOe verificar se ostatusdo chamado é de fechamento, para definir adataFechamentoadequadamente. - Implemente o método
newChamadonaServicepara instanciar um novo objetoChamadoa partir do DTO e configurar todas as associações e enums.
- Na camada de
- Incluir lista de
Chamadonas ClassesTecnicoeClienteNas classes
ClienteeTecnicopermite que o sistema estabeleça um relacionamento bidirecional entre essas classes e a entidadeChamado. Isso significa que cadaClientee cadaTecnicopodem ter uma lista de chamados associada a eles, e a entidadeChamadocontém uma referência aoClientee aoTecnicoque estão atendendo a esse chamado.Explicação do Relacionamento e da Necessidade de Adicionar o Campo
Relacionamento Bidirecional:
Ao adicionar a lista deChamadonas classesClienteeTecnico, o sistema permite navegar de umClienteouTecnicodiretamente para os chamados associados. Esse tipo de navegação é útil em várias operações, como:- Exibir todos os chamados de um
Clienteespecífico. - Obter os chamados que um determinado
Tecnicoestá 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 emClienteeTecnico, 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 umChamadodentro 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
chamadosnas classesClienteeTecnico:
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;
}
}