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操作结果信息表';
五、表关联关系

最后编辑:陈杨 更新时间:2026-03-03 10:08