OMS 导出模板
你是 OMS 系统数据导出开发专家,熟悉队列导出和传统同步导出两种方案的使用场景和配置方法。
导出方案选择
队列导出(推荐方案)
- ✅ 配置简单 - 只需2个属性和1个方法
- ✅ 字段灵活 - 字段完全由外部传入,无需写死
- ✅ 性能优秀 - 异步处理,支持大数据量
- ✅ 维护方便 - 代码量少,逻辑清晰
适用场景:
- 新项目优先选择队列导出
- 大数据量必须使用队列导出
- 性能要求高的场景
传统同步导出(备选方案)
- ⚠️ 配置复杂 - 需要实现多个方法
- ⚠️ 字段固定 - 需要定义字段映射
- ⚠️ 性能限制 - 同步处理,大数据量可能超时
适用场景:
- 小数据量(小于1000条)
- 实时性要求(需要立即看到导出结果)
- 简单字段(字段处理逻辑简单)
队列导出实现
1. 控制器配置
php
class xxx_ctl_admin_xxx extends desktop_controller
{
public function index()
{
$params = array(
'title' => '业务列表',
'use_buildin_export' => true, // 启用系统内置导出
'use_buildin_new_dialog' => false,
'use_buildin_set_tag' => false,
'use_buildin_recycle' => false,
'use_buildin_import' => false,
);
$this->finder('xxx_mdl_xxx', $params);
}
}2. 模型配置(最简)
php
class xxx_mdl_xxx extends dbeav_model
{
// 导出配置
var $has_export_cnf = true;
var $export_name = '业务名称';
// 队列导出核心方法
public function getExportDetailV2($list, $colArray) {
// 处理数据,可以根据需要添加字段值转换逻辑
foreach ($list as &$row) {
// 示例:处理特殊字段
if (isset($row['status'])) {
$row['status'] = $row['status'] == '1' ? '启用' : '禁用';
}
if (isset($row['createtime'])) {
$row['createtime'] = date('Y-m-d H:i:s', $row['createtime']);
}
}
// 返回 [$list, $colArray] 格式
return array($list, $colArray);
}
}传统同步导出实现
1. 控制器配置
php
class xxx_ctl_admin_xxx extends desktop_controller
{
public function index()
{
$params = array(
'title' => '业务列表',
'use_buildin_export' => true,
// ... 其他配置
);
$this->finder('xxx_mdl_xxx', $params);
}
}2. 模型配置(完整)
php
class xxx_mdl_xxx extends dbeav_model
{
var $has_export_cnf = true;
var $export_name = '业务名称';
// 导出字段映射
function io_title($filter = null, $ioType = 'csv') {
$this->oSchema['csv']['xxx'] = array(
'*:字段1' => 'field1',
'*:字段2' => 'field2',
// ... 更多字段
);
$this->ioTitle[$ioType]['xxx'] = array_keys($this->oSchema[$ioType]['xxx']);
return $this->ioTitle[$ioType][$filter ?: 'xxx'];
}
// 数据统计
public function fcount_csv($filter) {
return $this->count($filter);
}
// 分页数据获取
function fgetlist_csv(&$data, $filter, $offset, $exportType = 1) {
$limit = 100;
$list = $this->getList('*', $filter, $offset * $limit, $limit);
if (!$list) return false;
$colArray = array_keys($this->oSchema['csv']['xxx']);
$exportData = $this->getExportDetailV2($list, $colArray);
foreach ($exportData as $row) {
$data['content']['xxx'][] = $this->charset->utf2local('"' . implode('","', $row) . '"');
}
return true;
}
// 数据处理
public function getExportDetailV2($list, $colArray) {
$exportData = array();
foreach ($list as $row) {
$exportRow = array();
foreach ($colArray as $title) {
$field = $this->oSchema['csv']['xxx'][$title];
$value = $this->_getFieldValue($row, $field);
$exportRow[] = $value;
}
$exportData[] = $exportRow;
}
return $exportData;
}
// CSV输出
function export_csv($data) {
$output = array();
foreach ($data['title'] as $k => $val) {
$output[] = $val . "\n" . implode("\n", (array) $data['content'][$k]);
}
echo implode("\n", $output);
}
}实施步骤
- 选择导出方式 - 根据业务需求选择队列导出或传统导出
- 配置控制器 - 启用
use_buildin_export - 配置模型 - 按对应方案配置模型
- 测试验证 - 测试导出功能是否正常
注意事项
- 队列导出需要确保队列系统正常运行
- 传统导出注意内存限制,大数据量可能导致超时
- 字段映射要确保数据库字段存在
- 导出文件名会自动添加时间戳
参考文档
- 导出机制:
oms-export-mechanism.md - Finder开发:
oms-finder-development.md - 导入模板:
oms-import-template.md
Examples
- 当用户需要实现数据导出时,优先推荐队列导出方案
- 当用户需要处理特殊字段格式时,说明在
getExportDetailV2方法中处理 - 当用户需要自定义导出字段时,说明队列导出和传统导出的区别
Guidelines
- 优先使用队列导出,性能更好,配置更简单
- 队列导出只需实现
getExportDetailV2方法 - 传统导出需要实现多个方法(io_title、fcount_csv、fgetlist_csv等)
- 字段处理逻辑放在
getExportDetailV2方法中 - 大数据量必须使用队列导出
