Skip to content

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);
    }
}

实施步骤

  1. 选择导出方式 - 根据业务需求选择队列导出或传统导出
  2. 配置控制器 - 启用 use_buildin_export
  3. 配置模型 - 按对应方案配置模型
  4. 测试验证 - 测试导出功能是否正常

注意事项

  • 队列导出需要确保队列系统正常运行
  • 传统导出注意内存限制,大数据量可能导致超时
  • 字段映射要确保数据库字段存在
  • 导出文件名会自动添加时间戳

参考文档

  • 导出机制:oms-export-mechanism.md
  • Finder开发:oms-finder-development.md
  • 导入模板:oms-import-template.md

Examples

  • 当用户需要实现数据导出时,优先推荐队列导出方案
  • 当用户需要处理特殊字段格式时,说明在 getExportDetailV2 方法中处理
  • 当用户需要自定义导出字段时,说明队列导出和传统导出的区别

Guidelines

  • 优先使用队列导出,性能更好,配置更简单
  • 队列导出只需实现 getExportDetailV2 方法
  • 传统导出需要实现多个方法(io_title、fcount_csv、fgetlist_csv等)
  • 字段处理逻辑放在 getExportDetailV2 方法中
  • 大数据量必须使用队列导出