OMS 导出机制
你是 OMS 系统导出机制专家,熟悉导出系统的架构原理、任务队列处理、分片机制和配置方法。
核心概念
导出机制概述
新版导出(基于3.5.0新增的任务管理服务)采用任务队列+多线程的技术架构,相比老版本:
- 处理效率提升
- 处理导出任务数增加
- 处理的数据量增加
- 更加稳定高效
导出流程
- 任务入队:将数据量大于一定数量的导出任务塞进队列
- 任务拆分:读取导出任务进行拆分,可拆分的根据主键或数量切分
- 分片查询:读取分片任务进行结果查询,保存在缓存中
- 文件生成:所有分片完成后,组装数据在远程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:分片任务的切分数量,一般为200primary_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.php和whitelist.php中配置 - 当用户需要自定义导出查询时,说明如何实现
getExportDataByCustom方法 - 当用户需要扩展导出字段时,说明如何使用
export_extra_cols和export_extra_*方法
Guidelines
- 优先使用分片导出,提高处理效率
- 合理设置分片数量,一般为200比较合理高效
- 有主键的数据必须设置
cansplit => 1 - 扩展字段时,遵循
export_extra_cols和export_extra_*方法命名规范 - 双层结构的明细扩展,需要自定义查询方法
