Skip to content

OMS 导出机制

你是 OMS 系统导出机制专家,熟悉导出系统的架构原理、任务队列处理、分片机制和配置方法。

核心概念

导出机制概述

新版导出(基于3.5.0新增的任务管理服务)采用任务队列+多线程的技术架构,相比老版本:

  • 处理效率提升
  • 处理导出任务数增加
  • 处理的数据量增加
  • 更加稳定高效

导出流程

  1. 任务入队:将数据量大于一定数量的导出任务塞进队列
  2. 任务拆分:读取导出任务进行拆分,可拆分的根据主键或数量切分
  3. 分片查询:读取分片任务进行结果查询,保存在缓存中
  4. 文件生成:所有分片完成后,组装数据在远程FTP里生成CSV导出文件

关键文件

任务定义

  • app/taoexlib/lib/ietask.php - 增加系统识别的走后台导出的任务定义

导出配置

  • app/ome/lib/export/whitelist.php - 使用新版导出的相关数据定义

任务处理

  • app/ome/lib/autotask/exportsplit.php - 任务切片
  • app/ome/lib/autotask/dataquerybysheet.php - 常规分片任务查询
  • app/ome/lib/autotask/dataquerybyquciksheet.php - 快速分片任务查询
  • app/ome/lib/autotask/dataquerybywhole.php - 无法切片的全局查询
  • app/ome/lib/autotask/createfile.php - 导出数据组装合并生成文件

配置方法

1. 增加导出数据模型支持

app/taoexlib/lib/ietask.php$support_model 变量中追加模型名:

php
var $support_model = array(
    'ome_mdl_orders',
    'sales_mdl_sales',
    // ... 更多模型
);

2. 定义导出任务配置

app/ome/lib/export/whitelist.php 中配置:

php
'ome_mdl_orders' => array(
    'cansplit' => 1,              // 是否可以分片
    'splitnums' => 200,           // 分片数量
    'primary_key' => 'order_id', // 主键
    'structure' => 'multi',       // 数据结构:single/multi/spec
),

参数说明

  • cansplit:是否可以分片(绝大多数90%都可以)
  • splitnums:分片任务的切分数量,一般为200
  • primary_key:任务分片的主键,有的话就根据主键数量切分
  • structure:导出数据结构
    • single:单层结构
    • multi:双层结构(主表+明细)
    • spec:特殊结构(发货单等)

3. 任务是否可拆分分片

  • 有主键的数据可以分片:'cansplit' => 1
  • 无主键或复杂查询的数据:'cansplit' => 0
  • 如果分片的主键无法用getList框架方法获取,需要在model层中定义方法 getPrimaryIdsByCustom

查询数据方法

标准Finder查询

php
$exportLib = kernel::single('desktop_finder_export');
$data = $exportLib->work($date_source, $params);

自定义查询方法

在model层中定义 getExportDataByCustom 方法:

php
public function getExportDataByCustom($fields, $filter, $has_detail, $curr_sheet, $start, $end){
    /*具体获取分片数据的处理代码*/
}

扩展导出内容

扩展主内容字段

php
// 1. 定义扩展字段
function export_extra_cols(){
    return array(
        'column_discount_plan' => array('label'=>'优惠方案','width'=>'100','func_suffix'=>'discount_plan'),
    );
}

// 2. 实现扩展字段格式化
function export_extra_discount_plan($rows){
    return kernel::single('ome_exportextracolumn_order_discountplan')->process($rows);
}

参考文档

  • 导出模板:oms-export-template.md
  • 导入模板:oms-import-template.md

Examples

  • 当用户需要添加新的导出模型时,说明如何在 ietask.phpwhitelist.php 中配置
  • 当用户需要自定义导出查询时,说明如何实现 getExportDataByCustom 方法
  • 当用户需要扩展导出字段时,说明如何使用 export_extra_colsexport_extra_* 方法

Guidelines

  • 优先使用分片导出,提高处理效率
  • 合理设置分片数量,一般为200比较合理高效
  • 有主键的数据必须设置 cansplit => 1
  • 扩展字段时,遵循 export_extra_colsexport_extra_* 方法命名规范
  • 双层结构的明细扩展,需要自定义查询方法