Introdução ao Processamento xMova
Esse processo consiste em receber e processar requisições vindas de dispositivos mobile. Os tipos de requisição são:
- GET: solicitação de dados de identificação/validação;
- LIST: solitação de massa de dados;
- SEND: envio de dados armazenados nos dispositivos;
- XFS: solicitação de dados de processos de XFS.
Informações Relevantes
- Todo o processamento é executando usando o timezone "America/Sao_Paulo";
- Os dados de MARTE e TELEMETRY, apesar de recebidos, são processados em um processo separado;
- Durante a recepção dos dados são registrados dados do request e do dispositivos. Esses dados são registrados na tabela app_simovaapps_device;
- Durante a execução de todas as etapas do processo são exibidos retornos direcionados para a tela e/ou log. Dentre essas informações estão a hora de início e fim do processo, status de retorno e, dependendo da etapa do processo, informações referentes aos dados processados;
- Requisições sem dados a processar apresentarão o seguinte retorno:
{
"status": 98
}
- Requisição não salvas por inconsistência e/ou erro apresentarão o seguinte retorno:
{
"status": 97
}
- Requisição GET retornando vazio:
{
"status": 2
}
Status do Processando de Dados recebidos
Tabela nfs_sync_req_xmova
IND_SIT_PROC | Descrição |
---|---|
0 | Registro recebido e aguardando início do processamento |
1 | Dados distribuidos nas tabelas auth, binary, list, location, marte e telemetry |
5 | Início do Processamento dos dados |
50 | Em processamento |
-5 | DS não carregado / Usuário DS diferente do Request XMova |
-10 | JSON inválido |
-115 | Desconsiderar Request |
Tabela nfs_sync_req_xmova_list
IND_SIT_PROC | Descrição |
---|---|
0 | Recebido de Mobile |
1 | Registro definido para ser processado (existe na par_parametros_mobile) |
2 | Registro processado e feito INSERT na tabela APP (FK_OBJECT e FK_SEQ_DB) |
3 | Registro processado e feito UPDADE na tabela APP (FK_OBJECT e FK_SEQ_DB) |
4 | Registro processado e feito UPDADE SEM ALTERACADO DE DADOS NO REGISTRO |
5 | Registro está DELETED |
10 | Uso não definido para (não existe na par_parametros_mobile) |
115 | Descartado manualmente - Não processar (ex: Sem boletim no sistema) |
-1 | Erro Parse Location |
-2 | Erro no INSERT do Apontamento/Boletim |
-3 | Erro UPDATE do Apontamento/Boletim |
-4 | Não localizou o boletim |
-10 | Erro no Parse JSON |
-115 | Desconsiderar Request |
As colunas FK_OBJECT e FK_SEQ_DB agora estão sendo preenchidas conforme o uso definido
Início do Processamento / Reprocessamento
- Início do processamento:
php xmova/nfs_xmova_init_process.php nfs.local init
- Reprocessamento de Registro:
php xmova/nfs_xmova_init_process.php nfs.local try {SEQ_DB}
Caso não seja informado SEQ_DB, serão processados os registros que apresentaram erro (IND_SIT_PROC < 0 na tabela nfs_sync_req_xmova_list).
Campos do tipo FKL e Atualização destes nas tabelas
Foi adicionado um recurso chamado FK Latest - FKL - ao Core.
O objetivo desse recurso é dar rapidez aos painéis e outros recursos de gestão à vista. Como exemplo, imagine o painel de equipamentos ou técnicos, basta uma única consulta nessa tabela para obter uma referência rápida dos mais recentes dados que estão ligados a esta tabela, sem a necessidade de efetuar consultas ORDER BY INI_DH DESC LIMIT 1 que levam tempo e consomem muitoa concorrência no I/O do banco de dados.
Seu funcionamento é da seguinte forma:
O CORE analisa todas as tabelas Boletim e Apontamento (TABELA->MOBILE_TABLE > 0), usando o TABELA->FK_UP como referência. A tabela FK_UP é uma tabela USADA pela tabela boletim ou apontamento, por exemplo, EFETIVO_FUNCIONARIO é uma tabela "UP" da tabela EQP_BOLETIM pois o boletim de equipamento tem o funcionário como um campo do tipo FK. Após essa análise de FK_UP o CORE criará as colunas NOME_DA_TABELA_FKL e NOME_DA_TABELA_FKL_DH na tabela FK_UP, exemplo: Tabela EFETIVO_FUNCIONARIO campo EQP_BOLETIM_FKL Tabela EFETIVO_FUNCIONARIO campo EQP_BOLETIM_FKL_DH Tabela EQUIPAMENTO campo EQP_BOLETIM_FKL Tabela EQUIPAMENTO campo EQP_BOLETIM_FKL_DH Essa mesma regra é efetuada para tabelas de APONTAMENTO: Tabela OPERACAO campo EQP_APT_FKL Tabela OPERACAO campo EQP_APT_FKL_DH Tabela FAZENDA campo EQP_APT_FKL Tabela FAZENDA campo EQP_APT_FKL_DH
Quando esses campos são atualizados:
Todas as vezes que o core recebe dados do SimovaApps esses campos serão analisados e atualizados conforme uso definido na PARAM_MOBILE. Regra de atualização: O campo _FKL_DH recebe o valor de INI_DH ou FIM_DH (Quando for Boletim e estiver preenchido)
O valor INI_DH deve ser maior que o valor que já existe no campo _FKL_DH do registro.
O campo FKL terá sempre o último registro ENVIADO PELO SIMOVAAPPS - ainda não estamos tratando edição / inclusão manual / split / abertura automática
like a boss
Se você quer otimizar ainda mais o tempo de resposta do painel e até mesmo outras informações:
Por exemplo:
Saber quais foram os últimos apontamentos de atividade improdutiva, produtiva, abastecimento e manutenção, como fazer?
Criar campos do tipo FK na tabela EQUIPAMENTO: ULT_ATIVIDADE_IMPRODUTIVA ULT_ATIVIDADE_PRODUTIVA ULT_ABASTECIMENTO ULT_MANUTENCAO
Criar um entryPoint 19 (ver sobre entryPoint) na tabela de Apontamento e usar o array $valores para analisar a condição que você deseja, se for necessário o uso de outros campos desse apontamento, você pode consultar o registro que acabou de ser inserido:
Opção 1:
$apontamento = Dao::table('eqp_apt')
->where($_lastInsertId);
$operacoes = Dao::table('oper')
->groupBy('SEQ_DB')
->toArray()
->get();
$atualizarEquipamento = array();
if ($apontamento['TIPO_OPERACAO] == '1') { // atenção para certificar que o campo existe no array ou usar antes um isset ou empty
$atualizarEquipamento['ULT_ATIVIDADE_PRODUTIVA'] = $apontamento['SEQ_DB'];
} else {
$atualizarEquipamento['ULT_ATIVIDADE_IMPRODUTIVA'] = $apontamento['SEQ_DB'];
$operacao = $operacoes[$apontamento['OPER_SEQ_DB']];
if ($operacao['FLAG_ABASTECIMENTO']) {
$atualizarEquipamento['ULT_ABASTECIMENTO'] = $apontamento['SEQ_DB'];
} else if ($operacao['QIG_DISPLAY_MECANICO']) {
$atualizarEquipamento['ULT_MANUTENCAO'] = $apontamento['SEQ_DB'];
}
}
$retorno = Dao::table('eqp')
->where($apontamento['EQP_SEQ_DB'])
->updateRow($atualizarEquipamento);
Opção 2:
$operacaoSeqDb = $valores['OPER_SEQ_DB']''
$operacoes = Dao::table('oper')
->groupBy('SEQ_DB')
->toArray()
->get();
$operacao = $operacoes[$apontamento['OPER_SEQ_DB']];
$atualizarEquipamento = array();
if ($operacao['FLAG_IMPRODUTIVA']) {
$atualizarEquipamento['ULT_ATIVIDADE_IMPRODUTIVA'] = $apontamento['SEQ_DB'];
} else if ($operacao['FLAG_ABASTECIMENTO']) {
$atualizarEquipamento['ULT_ABASTECIMENTO'] = $apontamento['SEQ_DB'];
} else if ($operacao['QIG_DISPLAY_MECANICO']) {
$atualizarEquipamento['ULT_MANUTENCAO'] = $apontamento['SEQ_DB'];
}
if (!empty($atualizarEquipamento)) {
$retorno = Dao::table('eqp')
->where($apontamento['EQP_SEQ_DB'])
->updateRow($atualizarEquipamento);
}
tip Links úteis https://www.php.net/manual/pt_BR/function.empty.php https://www.php.net/manual/pt_BR/function.isset