Skip to content

StepIndex

Implementación índice Steps

Se realizó una implementación de indexación de la información desnormalizada de los Steps y su información asociada, similar a como se realizó con los envios (ShippingIndex). La diferencia con el índice de Shippings es que en este caso nos apoyamos en una colección en un MongoDB en lugar de usar una tabla en el mismo MySQL, buscando quitarle un poco de carga a la base MySQL.
Al igual que el otro índice, usamos una cola en RabbitMQ para hacer de manera asincrónica la inserción/ actualización en la base MongoDB.

Cola

if_step_index_add

Consumidor

app/console swarrot:consume:step_index_add if_step_index_add -vv

Ejemplo de mensaje a procesar

{
"step":{
"step_id":1151451,
"shipment_id":"REP0000000005276",
"tracking_id":"OR0001971416",
"order_id":"44000124945067",
"origin":"Origen",
"destination":"Pablo Nogu​\u00e9​s​",
"last_state":{
"​id​"​:​ ​27593​,
​ "​step_id​"​:​ ​1151451​,
​ "​state_nombre​"​:​ ​"​En proceso de devolucion​"​,
​ "​state_id​"​:​ ​51​,
​ "​date​"​:​ ​"​2020-09-24 17:22:06​"​,
​ "​class​"​:​ ​"​default​"​,
​ "​details​"​:​ ​"​El pedido se encuentra en proceso de devoluci​\u00f3​n al seller​"​,
​"​reason​"​:​ ​null​,
​ "​date_create​"​:​ ​"​2020-09-24 17:23:56​"
},
"last_state_client":{ ​
"​id​"​:​ ​27594​, ​
"​step_id​"​:​ ​1151451​,
​"​state_nombre​"​:​ ​"​Retirado​"​,
​"​state_id​"​:​ ​8​,
​ "​date​"​:​ ​"​2020-09-24 17:22:06​"​, ​
"​class​"​:​ ​"​warning​"​,
​ "​details​"​:​ ​"​IFLOW TIENE EL PAQUETE​"​,
​"​reason​"​:​ ​null​,
​ "​date_create​"​:​ ​"​2020-09-24 17:24:41​"
},
"last_state_carrier":{
​ "​id​"​:​ ​27594​,
​ "​step_id​"​:​ ​1151451​,
​ "​state_nombre​"​:​ ​"​Retirado​"​,
​"​state_id​"​:​ ​8​,
​ "​date​"​:​ ​"​2020-09-24 17:22:06​"​,
​"​class​"​:​ ​"​warning​"​,
​ "​details​"​:​ ​"​IFLOW TIENE EL PAQUETE​"​,
​"​reason​"​:​ ​null​,
​ "​date_create​"​:​ ​"​2020-09-24 17:24:41​"
},
"route_number":"165009",
"receiver":{
"id":925319,
"user_id":null,
"nickname":null,
"first_name":"Ramo​nees",
"last_name":"Galarza",
"receiver_name":"Maria Galarzaa",
"receiver_phone":"1123423424",
"email":"test000000@gmail.com",
"company":null,
"agency":null,
"address_street_name":"Susu Pecoraro",
"address_street_number":" ",
"address_other_info":" ",
"address_neighborhood_name":"TRELEW",
"address_zip_code":"9100",
"address_city":"TRELEW",
"address_state":"CHUBUT",
"address_country":"Argentina",
"address_floor":" ",
"address_apartment":null,
"address_between_1":" ",
"address_between_2":null,
"address_latitude":"-43.41850000",
"address_longitude":"-66.01109900"
},
"carrier":{
"id":61,
"name":"Urbano"
},
"queued":"0.19806000 1721385418",
"package_details":{
"volume":748,
"width":11,
"height":17,
"length":4,
"weight":180
},
"created_at":"​2020-05-12 16:48:03​",
"updated_at":"​2020-05-12 16:48:03​",
"carrier_shipment_id":null,
"carrier_destination":null,
"carrier_operation":null,
"shipping_cost":"6120.31",
"cancelled":null
},
"type":"new"
}

Se encola la misma info que se guarda en la base Mongo. Similar a lo que realiza ShippingIndex.
IMPORTANTE:
Se guarda la información del ultimo StepState (ultimo teniendo en cuenta la fecha del estado, no la fecha en que se dió de alta efectivamente en la base), también del el ultimo estado visible para el cliente y el último visible para el carrier. Todo esto teniendo en cuenta los flags de visibilidad de cada StepState.

last_state_client
last_state_carrier
last_state

Colección Índice Mongo

La colección donde se almacenan los documentos se llama: ​StepIndex

Ejemplo:

Untitled

En Symfony se utiliza el bundle ​doctrine/mongodb-odm-bundle, ​este nos permite utilizar el ORM para insertar/actualizar y buscar entidades en la base Mongo.
Para eso implementamos un documento: ​StepIndex

Comando para inserción masiva

app/consoles app1:api:steps:index

parametros​:
ACCIÓN: list
—carrier=[CARRIERID] (filtra solo steps del carrier con id CARRIERID) —desde=[YYYY-mm-dd] (Lista steps con fecha de alta (created_at) mayor que el parámetro) —hasta=[YYYY-mm-dd] (Lista steps con fecha de alta (created_at) menor que el parámetro) —limit=[integer] aplica un límite (integer) al listado

ACCIÓN: execute
—id=[STEP_ID] Id del step a encolar.

Ejemplos:

LIST: Lista los steps ingresados entre 2019-01-01 y 2019-09-01 para el carrier con id 61

app/console app1:api:steps:index list —carrier=61 —desde=2019-01-01 —hasta=2019-09-01
en console imprime:
1151229

EXECUTE: Realiza el encolado del step serializado para ser insertado en la colección Mongo
app/console app1:api:steps:index execute —id=1151229

EndPoint API nueva

Se implementó un nuevo endpoint para el listado de steps de un operador, este listado realiza la búsqueda en la colección MongoDB en lugar de la base MySQL. /api/v2/carrier/step​/

Ejemplo con filtro por Id de estado (sigue siendo igual a v1)

/api/v2/carrier/step​**/?filter[state_id]=10**