Listagem PACS por unidade (/listar-pacs)
Documentação funcional do caso de uso listar PACS por unidade do portal MM-PACS: consulta paginada das unidades (empresas) com dados de router, PACS externo, grupo, storage e ações de exportação, atualização de storage atual e edição do cadastro da unidade.
Índice
- Visão geral
- Rota e acesso
- Interface
- Fluxos de uso
- Models
- Serviços HTTP
- Outros serviços
- i18n
- Observações técnicas
- Âncoras de referência
Visão geral
A tela Listar PACS por unidade exibe uma tabela paginada das unidades vinculadas ao usuário logado, com campos relacionados a rede, URL do PACS externo, grupo de unidades, descrição DICOM, indicador de PACS externo, tamanho de storage, storage atual (com opção de atualizar via backend), uso do storage (calculado pelo frontend em MB/GB/TB) e atalho para editar a empresa.
- O atalho no menu fica no dropdown do perfil PROPRIETÁRIO (
#btn-proprietario), com o link#btn-proprietario-listar-pacsapontando paralistar-pacs. - O state
listarPacsnão declaracontrollerno UI-Router; o controller é aplicado no template viadata-ng-controller="empresaTableCtrl". - A busca de dados usa POST
/usuario/busca/empresas/:usuario_idcom corpo de filtro; após receber a lista, o controller encadeia com POSTconfig.USO_STORAGE_API_URL(via$q.all) para popular o campouso_storagede cada linha; a exportação PACS usa POST comresponseType: 'blob'; a atualização do storage atual chama PUT/pacsExterno/storage/.


Rota e acesso
| Item | Valor |
|---|---|
| State (UI-Router) | listarPacs |
| URL | /listar-pacs |
| Definição do state | app/core/config.route.js |
| Template | views/modais/listagemPacs.html |
| Controller no state | Nenhum (definido no template) |
| Controller efetivo | empresaTableCtrl — app/controllers/empresaTableCtrl.js |
| Menu (PROPRIETÁRIO) | views/layout/header.html — #btn-proprietario / #btn-proprietario-listar-pacs |
Interface
Cabeçalho e ações globais
| Elemento | ID / referência | Comportamento |
|---|---|---|
| Título da página | — | data-translate="LISTAR_PACS_POR_UNIDADE", estilo vermelho (section-header) |
| Voltar | #btn-listagem-pacs-voltar | Diretiva btn-voltar — histórico do navegador ($window.history.back()) |
| Exportar relatório PACS | #btn-listagem-pacs-exportar | ng-click="exportarPacs(filtro)" — ícone fa-print; gera arquivo XLSX via API e exportarRelatorioService |
Colunas da tabela
Cabeçalhos com ordenação visual (fa-angle-up / fa-angle-down e ng-click="order(...)"); ver Observações técnicas.
| Coluna (i18n) | Campo exibido (empresa) |
|---|---|
NOME_FANTASIA | nome_fantasia (com filtro ellipsis: 30) |
AE_TITLE_ROUTER | ea_title |
IP_ROUTER | ip |
PORTA_ROUTER | porta |
URL_PACS | url_pacs_externo |
GRUPO | grupoEmpresas_nome |
DESCRICAO | descricao_dicom |
PACS_EX | pacs_externo |
TAMANHO_DE_STORAGE | tamanho_storage |
STORAGE_ATUAL | Botão atualizar + texto storage_atual |
USO_DO_STORAGE | uso_storage — uso do storage formatado (MB/GB/TB), calculado pelo frontend via formatarBytes() |
ACOES | Botão editar |
Filtros
Objeto $scope.filtro. Em cada input de filtro: ng-keyup="$event.keyCode == 13 && buscar_empresas(filtro)" (Enter dispara a busca).
Campo (filtro.*) | ID do controle | Tipo |
|---|---|---|
nome_fantasia | #input-listagem-pacs-empresa-filtro | text |
ea_title | #input-listagem-pacs-ea-filtro | text |
ip | #input-listagem-pacs-ip-filtro | text |
porta | #input-listagem-pacs-porta-filtro | text |
url_pacs_externo | #input-listagem-pacs-url-externo-filtro | text |
grupoEmpresas_nome | #input-listagem-pacs-grupo-filtro | text |
descricao_dicom | #input-listagem-pacs-descricao-filtro | text |
is_pacs_externo | #select-listagem-pacs-externo-filtro | select: null (Todos), 0 (Não), 1 (Sim) |
tamanho_storage | #input-listagem-pacs-tamanho-filtro | text |
Botão Filtrar: #btn-listagem-pacs-buscar — ng-click="buscar_empresas(filtro)".
Linhas de dados e ações
ng-repeat="empresa in frontTable".
| Ação | ID | Comportamento |
|---|---|---|
| Atualizar storage atual | #btn-listagem-pacs-atualiza-storage-{{empresa.id}} | ng-click="atualizaStorageAtual(empresa)"; oculto se empresa.storage_atual == '' (ng-hide) |
| Texto storage atual | #i-listagem-pacs-storage-atual-{{empresa.id}} | {{empresa.storage_atual}} |
| Texto uso do storage | #i-listagem-pacs-storage-atual-{{empresa.id}} (coluna USO_DO_STORAGE) | {{empresa.uso_storage}} — preenchido após chamada a usoStorage; sem botão |
| Editar unidade | #btn-listagem-pacs-storage-editar-{{empresa.id}} | ng-href="empresa/{{empresa.id}}" — abre cadastro da empresa |
Células de dados usam IDs do tipo td-listagem-pacs-*-{{empresa.id}} (por exemplo td-listagem-pacs-empresa-{{empresa.id}}).
Paginação
uib-pagination:total-items="paginacao.total",items-per-page="filtro.total_registros",ng-model="filtro.pagina",ng-change="buscar_empresas(filtro)".- Registros por página:
#select-listagem-pacs-registros—ui-selectcomng-model="filtro.total_registros",ng-init="filtro.total_registros = 10", opções deregistosPorPagina(enumquantidadePorPaginasEnum: 10, 20, 30, 40, 50). - Texto “Mostrando de X a Y de Z registros”:
#span-listagem-pacs-mostrando-de,#span-listagem-pacs-mostrando-a,#span-listagem-pacs-mostrando-total.
Fluxos de uso
Pré-requisito
Usuário com permissão de PROPRIETÁRIO para ver o menu; acesso direto à URL pode depender de outras regras de autenticação do portal.
Fluxo — Listar e filtrar
- Acessar
/listar-pacs(menu PROPRIETÁRIO → Listar PACS por unidade ou URL direta). - Na carga,
empresaTableCtrlchamabuscar_grupoEmpresas()ebuscar_empresas()sem filtro inicial. buscar_empresasexecuta o seguinte encadeamento:- 1º
.then— recebe lista de empresas, populafrontTableepaginacao, extrai ostokende cada empresa. $q.all— chamausoStorage(token_empresas)e$q.when(empresasPorToken)em paralelo.- 2º
.then— itera sobreresponseStorage.data.data[], localiza a empresa pelovalue.department(token) e atribuiempresa.uso_storage = formatarBytes(value.tamanho_bytes). .finally— libera a flaglimitaFuncao = false(independentemente de sucesso ou erro).
- 1º
- Preencher os campos de filtro na primeira linha da tabela e clicar em Filtrar ou pressionar Enter em um dos inputs para refazer o fluxo acima com os parâmetros selecionados.
Fluxo — Exportar relatório PACS
- Ajustar filtros desejados (opcional).
- Clicar no ícone de impressão (
#btn-listagem-pacs-exportar). - O front envia
exportarPacscom até 5000 registros no filtro de paginação (_filtro.paginacao.total_registros = 5000) e faz download do XLSX com nome baseado na chaveRELATORIO_PACS.
Fluxo — Atualizar storage atual
- Localizar a linha da unidade com
storage_atualnão vazio (botão visível). - Clicar no botão play (
#btn-listagem-pacs-atualiza-storage-{id}). - Chamada PUT
/pacsExterno/storage/com o objeto da empresa comopacs_externo; em sucesso, atualizastorage_atualna linha e exibe notificação de sucesso.
Fluxo — Editar cadastro da unidade
- Clicar no ícone de lápis (
#btn-listagem-pacs-storage-editar-{id}). - Navegação para
empresa/{id}(formulário de empresa).
Models
empresaModel
| Arquivo | app/domain/models/empresaModel.js |
|---|
| Função | Uso nesta tela |
|---|---|
filtroEmpresaListNew(filtro) | Monta o payload da busca paginada em buscar_empresas. |
frontEmpresaList(response.data) | Mapeia a resposta para as linhas de frontTable. |
filtroEmpresaList(filtro) | Usada em exportarPacs (e em exportarUnidades na mesma controller, não usada neste template). |
gruposEmpresasModel
| Arquivo | app/domain/models/gruposEmpresasModel.js |
|---|
| Função | Uso |
|---|---|
filtro() | Corpo para listar grupos em buscar_grupoEmpresas. |
frontEmpresaTable(response.data) | Popula $scope.grupoEmpresas_nome (esta listagem PACS não exibe select de grupo como outras telas que usam o mesmo controller). |
Serviços HTTP
empresaHttpService
| Arquivo | app/services/http/empresaHttpService.js |
|---|
| Método | HTTP | Caminho | Uso |
|---|---|---|---|
buscarEmpresasMinhasFiltro(usuario_id, obj) | POST | config.API_URL + /usuario/busca/empresas/:usuario_id | Lista unidades com filtro e paginação. |
usoStorage(token_empresas) | POST | config.USO_STORAGE_API_URL | Body { token_empresas } — retorna data.data[] com { department, tamanho_bytes } para popular uso_storage de cada empresa. Sem Authorization header adicional (usa URL externa separada). |
exportarPacs(usuario_id, obj) | POST | config.API_URL + /usuario/busca/empresas/exportar/pacs/:usuario_id | Exportação XLSX (responseType: 'blob'). |
pacsExternoHttpService
| Arquivo | app/services/http/pacsExternoHttpService.js |
|---|
| Método | HTTP | Caminho | Uso |
|---|---|---|---|
atualizaStorage(pacs_externo) | PUT | /pacsExterno/storage/ | Body { pacs_externo: pacs_externo } — atualiza storage atual exibido na linha. |
gruposEmpresasHttpService
| Arquivo | app/services/http/gruposEmpresasHttpService.js |
|---|
| Método | HTTP | Caminho | Uso |
|---|---|---|---|
buscarGruposEmpresas(_filtroGrupos) | POST | /gruposEmpresas/lista | Inicialização de buscar_grupoEmpresas no controller. |
Outros serviços
| Serviço / dependência | Arquivo | Uso |
|---|---|---|
exportarRelatorioService | app/services/util/exportarRelatorioService.js | Persistir o blob retornado por exportarPacs como arquivo XLSX no cliente. |
storageService | — | getUser() para usuario_id; getToken() nos HTTP (via factory do serviço). |
enums | app/domain/enums/enums.js | quantidadePorPaginasEnum(), extensaoFileEnum() (XLSX na exportação). |
$q | AngularJS built-in | Usado em $q.all e $q.when para encadear a busca de empresas com a chamada de usoStorage em paralelo. |
i18n
Chaves principais em assets/i18n/pt-br.json.
Template listagemPacs.html
| Chave | Valor (pt-br) |
|---|---|
LISTAR_PACS_POR_UNIDADE | Listar PACS por unidade |
NOME_FANTASIA | Nome Fantasia |
AE_TITLE_ROUTER | AE Title do Router |
IP_ROUTER | IP do Router |
PORTA_ROUTER | Porta do Router |
URL_PACS | Url Pacs Externo |
GRUPO | Grupo |
DESCRICAO | Descrição |
PACS_EX | Pacs externo |
TAMANHO_DE_STORAGE | Tamanho do storage |
STORAGE_ATUAL | Storage atual |
USO_DO_STORAGE | Uso do storage |
ACOES | Ações |
TODOS | Todos |
NAO | Não |
SIM | Sim |
FILTRAR | Filtrar |
MOSTRANDO_DE | Mostrando de |
A_ACENTO | a |
DE | de |
REGISTROS | Registros |
Notificações e nome de arquivo (empresaTableCtrl)
| Chave | Uso |
|---|---|
CODIGO | Prefixo de código de erro nas notificações |
MSG_OPERACAO_ERROR | Título de erro |
MSG_OPERACAO_SUCESSO | Sucesso ao atualizar storage |
RELATORIO_PACS | Nome base do arquivo exportado |
Observações técnicas
- Ordenação por coluna: o template chama
order(...)e usarowemng-class, porémempresaTableCtrlnão defineordernemrow. Os cliques nos ícones de ordenação podem não ter efeito ou gerar erro em runtime até haver implementação compartilhada ou ajuste no controller. - Throttling:
buscar_empresasusa a flaglimitaFuncaopara evitar requisições concorrentes duplicadas; liberada no.finally()(garantido mesmo em caso de erro). - Grupos:
buscar_grupoEmpresasé executado no init; o escopogrupoEmpresas_nomenão é usado na UI deste template, mas permanece disponível no mesmo controller. - Funções auxiliares internas:
mensagemErro(erro)— normaliza a mensagem de erro para todas as notificações do controller; substitui a construção inline anterior em todos os.catch().formatarBytes(bytes)— converte um número de bytes para string legível (MB,GBouTB, 2 casas decimais). Retorna''para valores nulos, negativos ou não finitos.
uso_storagevsstorage_atual: são campos distintos.storage_atualé atualizado pontualmente via botão play (PUT/pacsExterno/storage/).uso_storageé preenchido automaticamente a cada busca viausoStoragee exibido na colunaUSO_DO_STORAGE.
Âncoras de referência
| Âncora | Conteúdo |
|---|---|
#visão-geral | Propósito da tela e screenshots comentados |
#rota-e-acesso | State, URL, arquivos |
#interface | Cabeçalho, colunas, filtros, ações, paginação |
#fluxos-de-uso | Filtrar, exportar, atualizar storage, editar |
#models | empresaModel, gruposEmpresasModel |
#serviços-http | Endpoints utilizados |
#i18n | Chaves de tradução |
#observações-técnicas | Ordenação, throttle, grupos |
Written by: Lucas Côrte Galdino de Freitas
Last modified: 24/04/2026
© 2026 Mobilemed. Todos os direitos reservados.