Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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:

  1. GET: solicitação de dados de identificação/validação;
  2. LIST: solitação de massa de dados;
  3. SEND: envio de dados armazenados nos dispositivos;
  4. XFS: solicitação de dados de processos de XFS.

Informações Relevantes

  1. Todo o processamento é executando usando o timezone "America/Sao_Paulo";
  2. Os dados de MARTE e TELEMETRY, apesar de recebidos, são processados em um processo separado;
  3. 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;
  4. 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;
  5. Requisições sem dados a processar apresentarão o seguinte retorno:
{
	"status": 98
}
  1. Requisição não salvas por inconsistência e/ou erro apresentarão o seguinte retorno:
{
	"status": 97
}
  1. Requisição GET retornando vazio:
{
	"status": 2
}

Status do Processando de Dados recebidos

Tabela nfs_sync_req_xmova

IND_SIT_PROCDescrição
0Registro recebido e aguardando início do processamento
1Dados distribuidos nas tabelas auth, binary, list, location, marte e telemetry
5Início do Processamento dos dados
50Em processamento
-5DS não carregado / Usuário DS diferente do Request XMova
-10JSON inválido
-115Desconsiderar Request

Tabela nfs_sync_req_xmova_list

IND_SIT_PROCDescrição
0Recebido de Mobile
1Registro definido para ser processado (existe na par_parametros_mobile)
2Registro processado e feito INSERT na tabela APP (FK_OBJECT e FK_SEQ_DB)
3Registro processado e feito UPDADE na tabela APP (FK_OBJECT e FK_SEQ_DB)
4Registro processado e feito UPDADE SEM ALTERACADO DE DADOS NO REGISTRO
5Registro está DELETED
10Uso não definido para (não existe na par_parametros_mobile)
115Descartado manualmente - Não processar (ex: Sem boletim no sistema)
-1Erro Parse Location
-2Erro no INSERT do Apontamento/Boletim
-3Erro UPDATE do Apontamento/Boletim
-4Não localizou o boletim
-10Erro no Parse JSON
-115Desconsiderar Request

As colunas FK_OBJECT e FK_SEQ_DB agora estão sendo preenchidas conforme o uso definido

Início do Processamento / Reprocessamento

  1. Início do processamento:
php xmova/nfs_xmova_init_process.php nfs.local init
  1. 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