CTT

    Serviços de Integração (EAI) - Repositório Documental de Aplicações

DecisionServerRS

A API DecisionServerRS é uma API REST que estabelece o interface entre sorters e o Servidor de Decisões dos CTT. Esta foi desenvolvida com recurso a produtos de integração seguros e robustos que asseguram uma comunicação transparente entre ambientes produtivos com sistemas e tecnologias heterogênias.

Este interface tem como objetivo possibilitar a pesquisa de destinos possíveis no servidor de decisões referentes à divisão de objetos, assim como notificar a correta classificação de objetos em tempo real.

Através da presente API é possível realizar as seguintes operações:

  • Consulta de destinos possíveis obtidos do servidor de decisões;
  • Notificar a classificação de objetos;
  • Ping de serviço;
  • Abertura/fecho de UATs;
  • Associação de um objecto a uma UAT em real-time;
  • Pedido de movimento de um objecto para posição de saída;

A definição destas operações expostas nos interfaces seguem a norma RESTful e um modelo de comunicação síncrono, o que exige a necessidade de manter a comunicação entre a realização dos pedidos e obtenção das respostas.


Especificação de modelos

A definição das entidades e modelos definidos está disponível em Swagger de acordo com a especificação OpenAPI versão 2.0.

Modelos de Input
Modelo Tipo de Dados Obrigatório Descrição
ClassificationInfo JSON.Object Sim Informação da classificação.
pic String Sim Código único recebido pelo classificador.
parcelCodes JSON.Array de BarcodeInfo Sim Lista de códigos lidos.
barcode String Sim Código lido.
x String Não Posição na máquina.
y String Não Posição na máquina.
z String Não Posição na máquina.
parcelCodesSize String Sim Número de códigos na lista parcelCodes.
objectMeasurements JSON.Object Sim Dimensões do objeto.
length String Sim Comprimento do objeto (mm)
height String Sim Altura do objeto (mm)
width String Sim Largura do objeto (mm)
volume String Sim Volume do objeto (cm3)
weight String Sim Peso do objeto (gr).
sortingMachineID String Sim Identificador da máquina de classificação.
sortingPlanID String Sim Identificador do plano de divisão ativo.
sortingEntryType String Sim Tipo de alimentação.
sortingEntryID String Não ID da linha de indução (Se ind. manual).
sortingStationID String Não ID da estação de alimentação (Se ind. manual).
postalCode String Não Código postal de destino do objeto (Se ind. manual).
requestTime String Não Data/hora do pedido.
DestinationNotification JSON.Object Sim Informação da classificação para notificar.
pic String Sim Código único recebido pelo classificador.
parcelCode JSON.Array Sim Código usado para classificar.
sortingMachineID String Sim Identificador da máquina de classificação.
sortingExitID String Sim Identificador da saída da máquina de classificação.
reason String Sim Motivo da classificação.
sortingType String Sim ID da estação de alimentação (Se ind. manual).
sortingDateTime String Sim Data/hora da classificação do objecto (yyyyMMddHHmmss).
sortingEntryType String Não Tipo de alimentação: “Manual” ou "Automatic".
sortingEntryID String Não ID da linha de indução (Se ind. manual).
sortingStationID String Não ID da estação de alimentação (Se ind. manual).
containerID String Sim Identificador do container de saída.
sortingPlanID String Sim Identificador do plano de divisão ativo.
objectMeasurements JSON.Object Sim Dimensões do objeto.
length String Sim Comprimento do objeto (mm)
height String Sim Altura do objeto (mm)
width String Sim Largura do objeto (mm)
volume String Sim Volume do objeto (cm3)
weight String Sim Peso do objeto (gr).
objectInformation JSON.Object Sim Informação do objeto.
parcelCode String Sim Código do objeto.
clientCode String Não Número do cliente.
contractCode String Sim Número do contrato.
senderPostalCode4 String Sim Código postal do remetente (CP4)
senderPostalCode7 String Não Código postal do remetente (CP7)
senderPostalCodeInt String Não Código postal do remetente (Internacional)
addresseePostalCode4 String Não Código postal do remetente (CP4)
addresseePostalCode7 String Não Código postal do destinatário (CP7)
addresseePostalCode10 String Não Código postal do destinatário (CP10)
addresseePostalCodeInt String Não Código postal do destinatário (Internacional)
class String Não Primeiro caracter do código de barras (classe)
subclass String Não Segundo caracter do código de barras (subclasse)
product String Não
customizedField1 String Não Campo personalizado 1
customizedField2 String Não Campo personalizado 2
customizedField3 String Não Campo personalizado 3
customizedField4 String Não Campo personalizado 4
customizedField5 String Não Campo personalizado 5
customizedField6 String Não Campo personalizado 6
customizedField7 String Não Campo personalizado 7
customizedField8 String Não Campo personalizado 8
customizedField9 String Não Campo personalizado 9
customizedField10 String Não Campo personalizado 10
objectDataExpirationDate String Sim Data de expiração dos dados do objeto
sortingMachineId String Não Identificador da máquina
sortingPlanId String Não Identificador do plano
sortingEntry String Não Identificador da linha de indução.
sortingEntryType String Não Tipo de alimentação: “Manual” ou "Automatic"
sortingExit String Não Identificador da saída da máquina de classificação.
sortingReason String Não
sortingType String Não ID da estação de alimentação (Se ind. manual).
sortingDateTime String Não Data/hora da classificação do objecto (yyyyMMddHHmmss).
routingNode String Não
destinationNode String Não
weight String Não Peso do objeto (gr).
height String Não Altura do objeto (mm)
length String Não Comprimento do objeto (mm)
width String Não Largura do objeto (mm)
volume String Não Volume do objeto (cm3)
dataSource String Não Data source - Http, File.
OpenCloseRequest JSON.Object Sim Informação de abertura/fecho de UAT.
destinationCode String Sim Identificador da tulha.
containerID String Sim Identificador do container de saída.
state String Sim Estado.
parcelCodes JSON.Array Sim Lista de códigos usados para classificar.
parcelCodes String Sim Código usado para classificar.
SortingInfo JSON.Object Sim Informação de sorting para associação a UAT.
timestamp String Sim Data hora.
sortingPlanID String Sim Identificador do plano de divisão ativo.
sortingRuleID String Sim Identificador da regra para o plano de divisão.

Exemplo ClassificationInfo:

{
	"pic": "6849",
	"parcelCodes": [
		{
			"barcode": "UD817750977NL",
			"x": 0,
			"y": 0,
			"z": 0
		}
	],
	"parcelCodesSize": 1,
	"objectMeasurements": {
		"length": "285",
		"height": "65",
		"width": "350",
		"volume": "6483750",
		"weight": "260"
	},
	"sortingMachineID": "TAX_MACHINE",
	"sortingPlanID": "1",
	"sortingEntryType": "Manual",
	"sortingEntryID": "2"
}

Exemplo DestinationNotification:

{
	"pic": "6804",
	"parcelCode": "LX206767326US",
	"sortingMachineID": "TAX_MACHINE",
	"sortingPlanID": "1",
	"sortingExitID": "7",
	"reason": "1+4",
	"sortingType": "Online",
	"sortingDateTime": "20210804115120",
	"containerID": "72021000678"
}

Exemplo OpenCloseRequest:

{
	"destinationCode": "17",
	"containerID": "72021000673",
	"state": "0",
	"parcelCodes": [
		"UD777331895NL",
		"UD535388624LT",
		"UC480028139TW",
		"LT884634404NL"
	]
}

Exemplo SortingInfo:

{
	"sortingPlanID": "1",
	"sortingRuleID": "14",
	"timestamp": "20210804122039"
}
Modelos de Output
Modelo Tipo de Dados Obrigatório Descrição
DestinationInfo JSON.Object Sim Informação dos destinos de divisão.
pic String Sim Código único recebido pelo classificador.
parcelCode String Sim Código usado para classificar.
reason String Sim Motivo da classificação.
destinations JSON.Array Sim Lista de destinos possíveis (tulhas).
destination String Não Identificador da tulha.
sortingPlanID String Não Identificador do plano de divisão ativo.
sortingRuleID String Não Identificador da regra para o plano de divisão.
sortingRuleDesc String Não Descrição da regra para o plano de divisão.
StatusInfo JSON.Object Sim Informação de status.
receptionStatusCode String Sim Código de status de receção.
receptionStatusMessage String Sim Mensagem de status de receção.

Exemplo DestinationInfo:

{
	"pic": "6849",
	"parcelCode": "UD817750977NL",
	"reason": "1+14",
	"sortingPlanID": "1",
	"sortingRuleID": "14",
	"sortingRuleDesc": "ICS2 Pendente 1 NI",
	"destinations": [
		"13"
	]
}

Exemplo StatusInfo:

{
	"receptionStatusCode": 2,
	"receptionStatusMessage": "Action was successfully received"
}

Interfaces Disponíveis

A tabela abaixo descreve os interfaces disponibilizados pela API para as operações referidas anteriomente na secção introdutória:


# Operação Resource
1 Consulta dos destinos possíveis obtidos do servidor de decisões. POST /decisionservice/destination/search
2 Notificar a classificação de objetos. POST /decisionservice/destination/notification
3 Ping de serviço. GET /decisionservice/destination/search
4 Abertura/fecho de UATs. POST /warehouse/uat/openclose
5 Associação de um objecto a uma UAT em real-time. POST /warehouse/uat/{containerID}/object/{objectNumber}/association
6 Pedido de movimento de um objecto para posição de saída. POST /warehouse/outgoingorders/object/{objectNumber}/exitPosition
Informação Pedido/Resposta
#Operação Headers Querystring Payload input Payload output
1 x-ibm-Client-ID; x-ibm-Client-Secret ClassificationInfo DestinationInfo
2 x-ibm-Client-ID; x-ibm-Client-Secret DestinationNotification
3 x-ibm-Client-ID; x-ibm-Client-Secret
4 x-ibm-Client-ID; x-ibm-Client-Secret OpenCloseRequest StatusInfo
5 x-ibm-Client-ID; x-ibm-Client-Secret SortingInfo StatusInfo
6 x-ibm-Client-ID; x-ibm-Client-Secret actionCode StatusInfo


Construção de endpoints

Os interfaces disponibilizados pela API são geralmente compostos por sete partes distintas como ilustrado na tabela abaixo.


https://api.qa.ctt.pt/qualidade-01/internal/decisionserverrs/v1/decisionservice/destination/search


Protocolo https
Hostname/servidor CTT api.qa.ctt.pt
Ambiente Qualidade (qualidade-01)
Catálogo internal
Identificação da API decisionserverrs
Versão v1
Resource do serviço /decisionservice/destination/search

Projetos de Teste

A configuração do ambiente para a realização de pedidos aos diferentes serviços disponibilizados pela API requer a utilização de software para testes automáticos (automated testing) como SoapUI ou Postman. Em alternativa, poderão também ser utilizadas ferramentas de linha de comandos como o cURL ou qualquer outra ferramenta de transferência de dados compatível com o protocolo HTTP.

Para efeitos de teste, disponibiliza-se o seguinte projeto de SoapUI:


Execução dos testes

O primeiro passo será realizar a importação do projeto de testes através do menu File:

File → Import Project



De seguida surgirá uma janela para carregar o projeto de testes disponibilizado para download no topo desta secção. Em alternativa, também é possível realizar a importação do projeto através da combinação Ctrl+I.

A expansão dos diferentes resources após a importação do projeto, permitirá visualizar a listagem dos diferentes casos de teste para cada interface. Cada interface poderá ter disponível um ou mais casos de teste distintos.

Para executar um teste a um determinado interface basta escolher o caso de teste pretendido:



A execução do teste é realizado através do apontador verde assinalado na figura seguinte:



A informação recebida é obtida no painel "JSON" assinalado do lado direito da figura.

O resultado global de sucesso da transação pode ser aferido pelo conteúdo dos seguintes headers devolvidos na resposta:

  1. X-Original-HTTP-Status-Code (200)
  2. x-iib-StatusCode (X0)
  3. x-iib-StatusMessage (Success)
  4. #status# (HTTP/1.0 200 OK)

Entre os restantes headers devolvidos na resposta, destaca-se também o header x-iib-TransactionID. O valor deste header representa um identificador único e universal. Por essa razão identifica de forma unívoca a transação realizada, e pode ser utilizado para efeitos de auditoria ou deteção de anomalias.