OR轨迹拉取功能优化

一、背景

​ 因为OR拉取轨迹考虑最极端情况需要调用OR接口多次v1/ get_completion_details(通过orderNO查询)和多次v1/search_orders以及多次v1/ get_completion_details(通过ID查询);以及下载多张派送图片、签名图片,上传谷歌云存储;对多张数据库表进行操作;生成POD文件等操作。导致定时任务从当前的两分钟延长到了三十分钟左右,考虑到以后单量会进一步拔升故此优化

二、目标

​ 预期承受订单为5W数据量,执行时间控制在一分钟内。

三、优化方案

​ 将原有方法拆成四个不同的定时任务,牺牲一定的数据同步性换取更快的执行效率。经组内讨论,优先同步订单状态和轨迹信息,再通过其他的定时任务更新图片数据和生成POD文件。

优先同步订单信息是因为相较于订单状态同步后置,轨迹信息不及时同步可能会导致客户投诉、严重情况会导致店铺被封。而派送图片和POD文件允许稍晚同步 优先同步订单信息是因为相较于订单状态同步后置,轨迹信息不及时同步可能会导致客户投诉、严重情况会导致店铺被封。而派送图片和POD文件允许稍晚同步

1.拉取OR成功轨迹信息

​ 优先处理OR派送成功信息,记录code=ERR_MULTIPLE_ORD_FOUND存入OR配送秘钥更新表中,然后更新订单状态和新增DD轨迹信息,对存在的问题件信息进行完结,最后将OR操作信息存入到新表or_operation_result【OR操作结果表】中。可以通过线程池和异步加快执行效率,可以通过手动事务进一步减少事务和并发粒度

2.OR更新图片信息

​ 主要通过or_operation_result(OR操作结果表)中的同步状态来判断是否进行同步,通过密钥批量访问OR接口返回图片信息,再通过线程池加快下载图片和上传谷歌云操作效率,最后更新or_operation_result表。

3.更新POD文件

​ 通过判断or_operation_result中同步信息来判断哪些数据需要更新POD文件,由于更新POD文件再更新图片流程后,可以不在访问OR接口,直接通过已有数据构建POD文件,POD文件更新完成之后整个OR派送成功订单流程完成。

4.拉取OR失败轨迹信息

 拉取到失败数据后,更新订单信息和新增轨迹信息,自动登记问题件

5.密钥同步OR

​ 目前存在一种情况,就是同一个跟踪号订单,前一天派送失败,今天派送成功时OR通过OrderNo去拉取数据拉取不回来,这时候只能通过orderNo先调用OR的v1/search_orders接口返回ID信息,再通过不同的ID调用v1/get_completion_details接口,再通过返回的数据拉取endTime最后一条信息,再判断OR拉取结果。所以再数据量大时,任务执行慢是可预见的。通过密钥去拉取OR的数据量偏小,因此此类情况可以兼容到通过密钥拉取OR派送信息(OrdersNewSecretPullTrackingTask)任务中

四、新增表数据

1.or_operation_result

create table or_operation_result
(
    result_id        bigint       not null auto_increment comment '结果id',
    orders_id        bigint       not null default 0 comment '订单id',
    tracking_number  varchar(64)  not null default '' comment '跟踪号',
    secret_key       varchar(128) not null default '' comment 'OptimoRoute密钥',
    orders_sync_flag tinyint      not null default 0 comment '订单同步标识 0-未同步 1-已同步',
    picture_flag     tinyint      not null default 0 comment '图片标识 0-未同步 1-已同步',
    pod_flag         tinyint      not null default 0 comment 'pod标识 0-未同步 1-已同步',
    over_flag        tinyint      not null default 0 not null comment '完结标识 0-未完结,1-已完结',
    create_user      bigint       not null comment '创建人',
    create_time      datetime     not null default CURRENT_TIMESTAMP not null comment '创建时间',
    update_user      bigint       null comment '更新人',
    update_time      datetime              default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
    primary key (result_id),
    key idx_orders_id (orders_id),
    key idx_tracking_number (tracking_number)
) ENGINE = INNODB
  DEFAULT CHARSET = utf8mb4 COMMENT = 'OR操作结果信息表';

五、表关联关系

作者:陆飞  创建时间:2025-12-18 14:18
最后编辑:陈杨  更新时间:2026-03-03 10:08