Projeto de Conclusão de Curso apresentado
como requisito parcial para obtenção do grau
Tecnólogo em Análise e Desenvolvimento de
Sistemas, pela Faculdade de Tecnologia de
Americana.
Time:
RAMON LACAVA GUTIERREZ GONÇALES
LEONARDO MARTINS DE OLIVEIRA
NATÁLIA AKINA UESUGI
Orientador: Prof. Dr. Kleber de Oliveira Andrade
Área de concentração: Engenharia de Software
Americana, SP
2018
Este trabalho se trata de uma plataforma de saúde digital unificada, que permite melhor gestão de informações de saúde e processos inteligentes.
A plataforma visa auxiliar o dia a dia das instituições de saúde e pacientes, buscando diminuir a quantidade de erros na área médica através de uma coleção consistente de dados do paciente, possibilitando que o sistema atue em qualquer instituição de saúde, e que tenha uma melhor eficiência e eficácia em atendimentos, sejam estes comuns ou de urgência e emergência.
O trabalho foi realizado em colaboração com a universidade de Durban, na África do Sul.
A metodologia empregada durante o decorrer do trabalho foi o SCRUM, que visa a transparência, dinamicidade e agrega valor ao produto final.
Foram desenvolvidos dois aplicativos para dispositivos móveis e um para computador, que realizam gestão de exames, diagnósticos, dados de saúde, medicamentos, instituições, médicos(as), dentre outros.
Diversos requisitos foram coletados de forma dinâmica com as equipes sul africanas para possibilitar a integração dos sistemas tanto no Brasil quanto na África do Sul.
Todo o desenvolvimento do sistema se voltou para agregar valor aos processos e interfaces de usuário (se focando em facilidade de uso e experiencia de usuário).
Os resultados foram dois aplicativos publicados na Google Play e um sistema computadorizado, sendo que os três estão em fase de testes na África do Sul.
Conclui-se que o sistema poderá auxiliar muito no ambiente da saúde, facilitando a gestão, fornecendo processos inteligentes e uma maior agilidade no atendimento, permitindo com que pacientes possuam acesso a seus dados de saúde, e com que funcionários de saúde possuam uma maior facilidade e uma maior quantidade de dados relevantes para análise durante os atendimentos.
Tabela - Formato do retorno do JSON com base nas classes de retorno
Formato JSON retornado pelas classes |
|||
MessageModel |
MessageListModel |
MessageNewUserModel |
MessageAuthModel |
{ “success”: true, “code”: 0, “description” : “Descrição” } |
{ “success”: true, “code”: 0, “description” : “Descrição”, “list” : [] } |
{ “success”: true, “code”: 0, “description” : “Descrição”, “id” : “”, “userModel” : {} } |
{ “success”: true, “code”: 0, “description” : “”, “userId” : “”, “token” : “”, “userType” : “”, “username” : “”, “secretCode” : “” } |
Tabela - Recursos da API de usuário
Recursos disponibilizados pela API de usuários |
|||
Endereço |
Método |
Autenticação |
Descrição |
/user |
POST |
Sim |
Adiciona um usuário |
/user/checkUserStatus |
POST |
Não |
Checa se um usuário já está cadastrado |
/user |
PUT |
Sim |
Atualiza um usuário |
/user/updateUserType |
PUT |
Sim |
Atualiza o tipo de usuário (ex: paciente passa a ser médico). |
/user |
DELETE |
Sim |
Exclui um usuário |
/user/{idUser} |
GET |
Sim |
Obtém os dados do usuário |
/user/secretCode |
GET |
Sim |
Obtém o código secreto do usuário. |
/user/search/{login} |
GET |
Sim |
Obtem os dados do usuário a partir do login. |
/user/auth |
POST |
Não |
Autentica o usuário em relação as apis que possuem autenticação. |
/user/healthinstitutionbind/{idUser} |
GET |
Sim |
Obtém as instituições de saúde que o usuário está vinculado. |
/user/sendPasswordMail |
POST |
Sim |
Envia um e-mail com login e senha para o usuário recém-criado. |
/user/uploadImage |
PUT |
Sim |
Atualiza a imagem do usuário. |
/user/image |
GET |
Não |
Obtém a imagem do usuário. |
Fonte: Elaborado pelo autor
Tabela - Recursos da API de paciente
Recursos disponibilizados pela API de paciente |
|||
Endereço |
Método |
Autenticação |
Descrição |
/patient |
POST |
Sim |
Adiciona um paciente |
/patient |
PUT |
Sim |
Altera um paciente |
/patient/patientData |
GET |
Sim |
Retorna os dados do paciente |
/patient/tagRegister |
POST |
Sim |
Adiciona um equipamento de acesso ao paciente |
/patient/tagUpdate |
PUT |
Sim |
Atualiza o equipamento de acesso |
/patient/tagDelete |
DELETE |
Sim |
Exclui o equipamento de acesso. |
/patient/listPatientTag |
GET |
Sim |
Lista os equipamentos de acesso do usuário |
/patient/tagExist |
GET |
Sim |
Verifica se o equipamento de acesso já está cadastrado. |
/patient/tag |
GET |
Sim |
Obtém o paciente a partir do equipamento de acesso. |
/patient/diagnosis |
POST |
Sim |
Adiciona um diagnóstico. |
/patient/diagnosis |
PUT |
Sim |
Altera um diagnóstico |
/patient/diagnosis |
DELETE |
Sim |
Exclui um diagnóstico |
/patient/diagnosis |
GET |
Sim |
Obtém uma lista de diagnósticos de um paciente. |
/patient/diagnosis/procedures |
GET |
Sim |
Obtém uma lista de procedimentos realizados em um diagnóstico. |
/patient/disease |
GET |
Sim |
Obtém uma lista de doenças cadastradas. |
/patient/disease |
POST |
Sim |
Adiciona uma doença ao paciente. |
/patient/disease |
PUT |
Sim |
Altera uma doença do paciente. |
/patient/disease |
DELETE |
Sim |
Exclui uma doença do paciente |
/patient/patientDisease |
GET |
Sim |
Obtém uma lista de doenças do paciente |
/patient/exam |
POST |
Sim |
Adiciona um exame |
/patient/exam |
PUT |
Sim |
Altera um exame |
/patient/exam |
DELETE |
Sim |
Exclui um exame |
/patient/exam |
GET |
Sim |
Obtém um exame |
/patient/exam/attachment |
POST |
Sim |
Adiciona um anexo ao exame |
/patient/exam/attachment |
DELETE |
Sim |
Exclui um anexo do exame |
/patient/exam/attachment |
GET |
Sim |
Obtém uma lista de anexos de um exame |
/patient/listMedicines |
GET |
Sim |
Lista os medicamentos cadastrados. |
/patient/registerMedicine |
POST |
Sim |
Adiciona um medicamento |
/patient/bindMedicine |
POST |
Sim |
Adiciona um medicamento ao paciente |
/patient/unbindMedicine/{idPatient} |
DELETE |
Sim |
Desvincula um medicamento do paciente |
/patient/listPatientMedicines |
GET |
Sim |
Obtém uma lista de medicamentos do paciente. |
/patient/diagnosis/image |
GET |
Sim |
Obtém a assinatura do diagnóstico. |
/patient/exam/attachment/document |
GET |
Sim |
Obtém o anexo do exame. |
/patient/listPatientHistory |
GET |
Sim |
Obtém o histórico médico do paciente |
/patient/listKnownPhysicians |
GET |
Sim |
Lista os médicos conhecidos pelo paciente |
Fonte: Elaborado pelo autor
Tabela - Recursos disponibilizados pela API de médico(a)
Recursos disponibilizados pela API de médico(a) |
|||
Endereço |
Método |
Autenticação |
Descrição |
/physician |
POST |
Sim |
Adiciona um médico(a) |
/physician |
PUT |
Sim |
Altera um médico(a) |
/physician |
GET |
Sim |
Retorna os dados do(a) médico(a) |
/physician/userdata |
GET |
Sim |
Retorna dados do usuário. |
/physician/listSpecializations |
GET |
Sim |
Lista as especializações do médico |
/physician/specialization |
GET |
Sim |
Lista todas as especializações de um determinado país |
/physician/bindSpecialization |
POST |
Sim |
Adiciona uma especialização ao médico |
/physician/unbindSpecialization |
DELETE |
Sim |
Remove uma especialização do médico. |
/physician/listDiagnosisHistory |
GET |
Sim |
Lista o histórico de diagnóstico do(a) médico(a) em uma instituição de saúde |
/physician/listExamHistory |
GET |
Sim |
Lista o histórico de diagnóstico do(a) médico(a) em uma instituição de saúde |
/physician/listPhysicianInNearArea |
GET |
Sim |
Lista os médicos próximos de uma determinada latitude e longitude |
/physician/physicianAttendanceRegister |
POST |
Sim |
Registra um atendimento médico em uma instituição de saúde. |
/physician/listPhysicianAttendance |
GET |
Sim |
Lista os atendimentos feitos pelo(a) médico(a) em uma instituição de saúde. |
/physician/listAttendanceGraph |
GET |
Não |
Lista os dados de atendimento do médico no mês corrente. |
Fonte: Elaborado pelo autor
Tabela - Recursos disponibilizados pela API de enfermeiro(a)
Recursos disponibilizados pela API de enfermeiro(a) |
|||
Endereço |
Método |
Autenticação |
Descrição |
/nurse |
POST |
Sim |
Adiciona um enfermeiro(a) |
/nurse |
PUT |
Sim |
Altera um enfermeiro(a) |
/nurse |
GET |
Sim |
Retorna os dados do(a) enfermeiro(a) |
/nurse/listSpecializations |
GET |
Sim |
Lista as especializações que o(a) enfermeiro(a) possui |
/nurse/bindSpecialization |
POST |
Sim |
Adiciona uma especialização a um(a) enfermeiro(a) |
/nurse/unbindSpecialization |
DELETE |
Sim |
Remove uma especialização do(a) enfermeiro(a) |
/nurse/addAttendance |
POST |
Sim |
Adiciona um atendimento |
/nurse/updateAttendance |
POST |
Sim |
Atualiza um atendimento |
/nurse/listAttendance |
GET |
Sim |
Lista os atendimentos pelo(a) enfermeiro(a) em uma instituição de saúde |
Fonte: Elaborado pelo autor
Tabela - Recursos disponibilizados pela API de instituição de saúde
Recursos disponibilizados pela API de instituição de saúde |
|||
Endereço |
Método |
Autenticação |
Descrição |
/healthinstitution |
POST |
Sim |
Adiciona uma instituição |
/healthinstitution |
PUT |
Sim |
Altera uma instituição |
/healthinstitution |
GET |
Sim |
Retorna uma lista de instituições de saúde dado uma posição geográfica. |
/healthinstitution/list |
GET |
Não |
Lista as instituições de saúde de modo paginado. |
/healthinstitution |
DELETE |
Sim |
Remove uma instituição |
/healthinstitution/{idHealthInstitution} |
GET |
Sim |
Obtém os dados de uma instituição de saúde |
/healthinstitution/bind |
POST |
Sim |
Vincula um usuário a uma instituição de saúde |
/healthinstitution/updatebind |
PUT |
Sim |
Atualiza o vínculo do usuário com a instituição |
/healthinstitution/deletebind |
DELETE |
Sim |
Remove o vínculo do usuário com a instituição |
/healthinstitution/userlist/{idHealthInstitution} |
GET |
Sim |
Retorna os usuários de uma dada instituição |
/healthinstitution/image |
GET |
Sim |
Retorna a foto da instituição de saúde |
/healthinstitution/physician |
GET |
Sim |
Retorna médicos(as) e suas respectivas especializações |
/healthinstitution/nurse |
GET |
Sim |
Retorna as enfermeiras de uma instituição de saúde |
/healthinstitution/waitlist/{idHealthInstitution} |
POST |
Sim |
Adiciona um diagnóstico a lista de espera do hospital |
/healthinstitution/updatewaitlist/{idHealthInstitution} |
POST |
Sim |
Atualiza a chegada de um paciente na lista do hospital |
Fonte: Elaborado pelo autor
Tabela - Recursos disponibilizados pela API de trilha de auditoria
Recursos disponibilizados pela API de trilha de auditoria |
|||
Endereço |
Operação |
Autenticação |
Descrição |
/auditTrail/listAuditTrail |
GET |
Sim |
Lista a trilha de auditoria dada uma determinada data |
Fonte: Elaborado pelo autor
Tabela - Recursos disponibilizados pela API de erro
Recursos disponibilizados pela API de trilha de erro |
|||
Endereço |
Método |
Autenticação |
Descrição |
/errorlog/list |
GET |
Não |
Lista a quantidade de erros em forma de gráfico (considera o mês atual). |
/errorlog/listErrors |
GET |
Sim |
Lista os erros que ocorreram dado uma determinada data. |
Fonte: Elaborado pelo autor
Esta seção contempla as ferramentas de programação e os conceitos necessários para o desenvolvimento do NFC Health System.
- Android Studio: ambiente de desenvolvimento integrado (IDE) oficial para o desenvolvimento de aplicativos Android, baseado no InteliJ IDEA[1], que oferece um ambiente unificado para o desenvolvimento de aplicativos. No qual é possível desenvolver, fazer debugs, testes e interfaces para smartphones e tablets Android e dispositivos Android Wear, Android TV e Android Auto (ANDROID, 2017).
- Eclipse: É uma plataforma aberta que facilita o processo de desenvolvimento, fornecendo ferramentas para codificação, construção, execução e debug de aplicações (UMBC, 2008). Esta ferramenta suporta o desenvolvimento em diversas linguagens e foi utilizada para o desenvolvimento dos webservices do sistema.
- SQL Server Management Studio: O SSMS é um ambiente integrado que é utilizado para gerenciamento da infraestrutura de SQL, atuando do SQL Server para o Banco de dados SQL do Azure. Fornece ferramentas para configurar, monitorar e gerenciar as instâncias do SQL, e para implantar, monitorar e atualizar componentes da camada de dados (Microsoft, 2018).
- Netbeans: Permite que de forma rápida e fácil seja desenvolvido aplicações em Java destkop, mobile, web, assim como aplicações HTML5, JavaScript e CSS. A IDE também fornece boas ferramentas para PHP, C e C++. É uma plataforma de código aberto com uma vasta comunidade de usuários e desenvolvedores (Netbeans, 2018). É utilizado para o desenvolvimento do sistema desktop.
- NFC (Near Field Communication): Tecnologia de curto alcance, distância de cerca de 4 a 20 centímetros (TORRES, 2008), alta frequência e baixa largura de banda, permitindo a comunicação sem fio através de dois dispositivos habilitados com NFC (COSKUN, 2011).
- Adesivos NFC: Equipamentos de acesso utilizados, comumente conhecidos como INLAY, possuem apenas DIE (pastilha de silício onde se encontra o circuito do NFC). Ao adicionar um encapsulamento plástico ao INLAY, o resultado é uma tag com maior durabilidade e resistência, porem esta possui um custo maior do que as que não estão encapsuladas (CUNHA, 2016).
- Módulo leitor RFID NFC PN532: O PN532 é um módulo de alta integração para comunicação sem contato que atua na frequência de 13.56 MHz. O modulo de transmissão utiliza um conceito de modulação e demodulação completamente integrados para diferentes tipos de comunicação. O módulo suporta tanto leitura quanto escrita e funciona em uma distância de até 7 centímetros. É utilizado para a leitura dos equipamentos de acesso dos pacientes.
- Arduino: O Arduino é um placa eletrônica de código aberto criado pelo time Massimo Banzi, David Cuartilles, Tom Igoe, Gianluca Martino, e David Mellis com o objetivo de desenvolver hardwares micro controladores de fácil uso que estaria disponível a todos (BARRETT, 2013).
- REST: REST (Representational State Transfer) define um conjunto de princípios arquiteturais os quais podem ser utilizados para projetar web services focados em recursos do sistema, incluindo como os estados dos recursos são endereçados e transferidos através do protocolo HTTP[2] por uma ampla variedade de clientes escritos em diferentes linguagens (RODRIGUEZ, 2008). Também pode ser definido como um estilo híbrido derivado de vários estilos de arquitetura baseados em rede e combinado com restrições adicionais que definem uma interface de conexão uniforme (FIELDING, 2000). Este conjunto de princípios arquiteturais foi escolhido devido à grande popularidade que vem ganhando em meio aos desenvolvedores, juntamente a diversas implementações nas mais variadas linguagens de programação e bibliotecas (RODRIGUEZ, 2008).
- Android: É um Sistema Operacional para dispositivos móveis que foi criado com base em Linux de código aberto (ANDROID DEVELOPERS, 2018). Atualmente, o Android pode ser encontrado em diversos dispositivos, como smartphones, relógios, TVs e até mesmo carros. De acordo com a pesquisa realizada pelo jornal EL PÁIS em Abril de 2017, o Android vem cada vez mais crescendo seus números de usuários, fazendo com que seja ultrapassado o número de usuários de Windows (MENDIOLA, 2017).
- Java: É uma tecnologia utilizada para desenvolvimento de aplicações, que podem ser Web, Desktop ou até mesmo mobile, sendo orientada a objetos, compilada e interpretada. Atualmente o Java é uma das tecnologias mais utilizadas do mundo, que de acordo com a Oracle, cerca de 97% dos Desktops executam Java e 89% dos desktops nos Estados Unidos também o executa. Esses números se dão ao fato de que essa tecnologia foi projetada para permitir o desenvolvimento de aplicativos portáteis de alto desempenho e para que se possa abranger todas as plataformas possíveis (ORACLE, 2018).
- C: É uma linguagem de médio nível (permitindo manipulação de bits, bytes e endereços), de grande portabilidade , estruturada e compilada (ou seja, o código em C é traduzido em um código-objeto que pode ser entendido pelo computador) e muito utilizado na programação de sistemas operacionais, compiladores, gerenciadores de banco de dados, dentre diversas outras aplicações (SCHILDT, 1997). A linguagem foi utilizada para o desenvolvimento do sistema em Arduino.
- Armazenamento em nuvem: Armazenamento em nuvem é a disponibilização de capacidade de armazenamento em hardwares remotos (data-centers[3]), fazendo assim que não exista mais a necessidade do gerenciamento de hardware para armazenamento de dados(DRAGO et al., 2012).Existem muitas empresas que provêm armazenamento em nuvem como: Microsoft, Google, Amazon, dentre outros (DRAGO et al., 2012). Para este trabalho de graduação estaremos utilizando a Microsoft Azure para a utilização do serviço de armazenamento em nuvem.
- Azure: É uma plataforma em na nuvem para hospedar aplicativos e simplificar o processo de desenvolvimento. A Microsoft Azure integra diversos serviços de nuvem muito uteis para desenvolver, testar, implantar e gerenciar aplicativos, tudo aproveitando a computação em nuvem (Microsoft, 2017).
- SQL Server: É uma das partes centrais da plataforma de dados da Microsoft, sendo líder em sistemas de gerenciamento de banco de dados operacionais. É um sistema de gerenciamento de banco de dados relacional altamente escalável (Quackit, 2018).
- Apache Tomcat: É um sistema de código aberto que implementa diversas tecnologias, tais como Java Servlet, Java Server Pages, dentre outras (Apache Tomcat, 2018). Ela é utilizada para o desenvolvimento dos webservices.
- RabbitMQ: É um intermediário de mensagens construído em Erlang, que implementa o protocolo AMQP, responsável por aceitar e encaminhar mensagens. Basicamente, um produtor envia uma mensagem, que através de uma área de troca (Exchange) é encaminhada a uma fila, onde esta mensagem deverá ser consumida por um consumidor (RabbitMQ, 2018). É utilizado para gerenciamento das filas de atendimento dos(as) enfermeiros(as).
- CloudAMQP: É um serviço que gerencia os servidores que executam RabbitMQ na nuvem (CloudAMQP, 2018).
- Maven: É uma ferramenta de gestão de projetos e se baseia no conceito de projeto de objeto de modelo (POM). O maven pode gerenciar a criação, relatório e documentação de um projeto a partir de um centro de informações (Apache Maven, 2018). É a ferramenta utilizada para gestão dos projetos desenvolvidos em Java.
- Pusher Channels: Fornece comunicação em tempo real entre servidor, aplicativo e dispositivos, sendo usado para notificações, chats, jogos, web, internet das coisas, e outros sistemas que utilizam comunicação em tempo real (Pusher, 2018).
- Astah UML: É uma ferramenta que suporta os requerimentos da UML 2.x para construção de diagramas de classe, caso de uso, sequencia, máquina de estado, atividade, componente, dentre outros (ASTAH, 2018). É a ferramenta utilizada para a construção dos diagramas de classe e caso de uso.
- Fritzing: É um sistema para automação de design eletrônico, com o objetivo de fornecer ferramentas fáceis para documentar e compartilhar projetos de computação física (FRITZING, 2018). É a ferramenta utilizada para construção do circuito do sistema Arduino.
- Arduino IDE: Esta ferramenta de código aberto faz com que seja fácil desenvolver o código e realizar o upload para a placa utilizada (Arduino, 2018). É a ferramenta utilizada para o desenvolvimento do sistema do Arduino.
[1] Intellij IDEA é um JAVA IDE da empresa JetBrains. Disponível em: <https://www.jetbrains.com/idea>.
[2] O HTTP (Hypertext Transfer Protocol) é um protocolo no nível de aplicação para informações distribuídas, colaborativas e de hipermídia
[3] Centrais de armazenamento de dados
Copyright 2019
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.