首页 > 其他分享 >Api流式导出大数据

Api流式导出大数据

时间:2024-11-29 10:10:49浏览次数:5  
标签:search name 导出 考試 流式 item Api test score

API流式导出大数据

<?php

namespace App\Admin\Exports;

use App\Admin\Services\Statistics\ExaminationRecordsDataService;
use App\Enums\ExaminationStatus;
use Generator;
use Maatwebsite\Excel\Concerns\FromGenerator;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithStrictNullComparison;

class ExaminationRecordExport implements FromGenerator, WithHeadings, WithStrictNullComparison
{
    private array $search;

    public function __construct(array $search)
    {
        $this->search = $search;
    }

    /**
     * @return Generator
     */
    public function generator(): Generator
    {
        $offset = 0;
        $chunkSize = 1000;
        $service = new ExaminationRecordsDataService();
        $this->search['sort'] = 'examination_records.id';
        $query = $service->getExaminationRecordsQuery($this->search)->limit($chunkSize);

        while (true) {
            $results = $query->clone()->offset($offset)->get();
            if ($results->isEmpty()) {
                break;
            }

            foreach($results as $item) {
                yield [
                    'user_name' => $item->user_name,
                    'group_name' => $item->group_name,
                    'title' => $item->title,
                    'course_serial_number' => $item->course_serial_number,
                    'name' => $item->name,
                    'serial_number' =>$item->serial_number,
                    'examination_status' => ExaminationStatus::from($item->examination_status)->label(),
                    'exam_nums' => $item->exam_nums,
                    'total_score' => $item->total_score,
                    'passing_score' => $item->passing_score,
                    'score' => $item->score,
                    'test_start_time' => $item->test_start_time->format('Y-m-d H:i:s'),
                    'test_end_time' => $item->test_end_time->format('Y-m-d H:i:s'),
                    'total_test_duration' => $item->total_test_duration,
                    'test_duration' => floor($item->test_duration / 60 * 100) / 100, // 分钟
                ];
            }

            $offset += $chunkSize;
        }
    }

    public function headings(): array
    {
        return [
            'user_name' => '姓名',
            'group_name' => '所屬組織',
            'title' => '所屬課程名稱',
            'course_serial_number' => '所屬課程編號',
            'name' => '考試名稱',
            'serial_number' => '考試編號',
            'examination_status' => '考試狀態',
            'exam_nums' => '考試次數',
            'total_score' => '總分',
            'passing_score' => '通過分數',
            'score' => '考試最高分',
            'test_start_time' => '最高分考試的開始時間',
            'test_end_time' => '最高分考試的結束時間',
            'total_test_duration' => '考試規定時長(分鐘)',
            'test_duration' => '最高分考試的進行時長(分鐘)',
        ];
    }
}
<?php

namespace App\Admin\Controllers;

use App\Admin\Exports\ExaminationRecordExport;
use App\Admin\Requests\Examination\GetExaminationRecordsListRequest;
use App\Admin\Resources\ExaminationRecord\ExaminationRecordCollection;
use App\Admin\Services\Statistics\ExaminationRecordsDataService;
use App\Traits\SearchStaffGroupTrait;
use App\Traits\SearchTrait;

class ExaminationController extends BaseController
{
    use SearchTrait, SearchStaffGroupTrait;

    public function getExaminationRecordsList(GetExaminationRecordsListRequest $request)
    {
        $search = $request->validated();
        $examinationRecords = (new ExaminationRecordsDataService())->getExaminationRecordsPage($search);
        return new ExaminationRecordCollection($examinationRecords);
    }

    public function export(GetExaminationRecordsListRequest $request)
    {
        set_time_limit(0);
        ini_set('memory_limit', '512M');

        $search = $request->validated();
        $export = new ExaminationRecordExport($search);

        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
        header('Content-Disposition: attachment; filename=學員考試記錄.csv');
        header('Content-Type: text/csv; charset=gb18030');
        header("Content-Transfer-Encoding: binary");
        header("Pragma: no-cache");

        echo mb_convert_encoding(implode(',', array_values($export->headings())), 'gb18030') . "\n";
        foreach ($export->generator() as $item) {
            echo mb_convert_encoding(implode(',', array_values($item)), 'gb18030') . "\n";
        }
    }
}
const fileUrl = 'https://apitest-new-lms.wiltechs.com/api/admin/exampapers/questions/template?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vYXBpdGVzdC1uZXctbG1zLndpbHRlY2hzLmNvbS9hcGkvYWRtaW4vYXV0aC9sb2dpbiIsImlhdCI6MTcwODQ3NzgyNiwiZXhwIjoxNzA4NTY0MjI2LCJuYmYiOjE3MDg0Nzc4MjYsImp0aSI6IlpuY0VqbWFVbUxnZ01FdVYiLCJzdWIiOiIxOEZENjAzQi03MjcwLTQyMkYtOTZDOS03M0U5QzQ0ODUyMzIiLCJwcnYiOiI3ZWJiOGEyY2MxZDk1YjYyYzk1OTRhMjJjOWNlYzIyZjM4ZGI1ZDMxIn0.D6Ie6QzG0Zm7Yw7nr1sOlaHon7noSY-2gyqpUfNXHfE';

const a = document.createElement('a');
const event = new MouseEvent('click');
a.href = fileUrl;
// a.download = fileName;
a.dispatchEvent(event);

标签:search,name,导出,考試,流式,item,Api,test,score
From: https://www.cnblogs.com/tujia/p/18575944

相关文章

  • HW3:使用 API 快速搭建你的第一个 AI 应用
    目录0前言1安装库2导入与设置3第1部分:文章摘要(单轮对话应用)3.1任务简介:3.2初始化: 3.3点击发送(默认温度因子为1):3.4设置温度因子为2并重新发送:3.5保存一下:3.6如何关闭demo.launch()呢?3.7 检查并打印你的结果4第2部分:角色扮演(多轮对话应用)4.1任务简介......
  • [Vue] Composition API LifeCycle Methods
    InVue3’sCompositionAPIwecancreatecallbackhooksinside setup() byadding on totheLifeCyclemethodname:import{onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted,onActivated,onDeactivated,on......
  • 鸿蒙ArkUI-X已更新适配API13啦
    ArkUI-X5.0.1Release版配套OpenHarmony5.0.1Rlease,API13,新增适配部分API13接口支持跨平台;框架能力进一步完善,支持Android应用非压缩模式,支持AndroidFragment对接跨平台。ACETools工具易用性提升,支持创建module时选择module类型、config提示优化和联动编译。组件跨平台能力......
  • Next.js 独立开发教程(九):流式渲染(Streaming)
     系列文章目录Next.js开发教程(一):入门指南-CSDN博客Next.js开发教程(二):从零构建仪表盘应用-CSDN博客Next.js开发教程(三):CSS样式的完整指南-CSDN博客Next.js独立开发教程(四):字体与图像优化指南-CSDN博客Next.js独立开发教程(五):创建布局和页面-CSDN博客Next.js独......
  • vue3-其余新增API
    shallowRef创建一个响应式数据,但只对顶层属性进行响应式处理,只跟踪引用值的变化,不关心值内部的属性变化import{shallowRef}from"vue"importUserInfofrom"@/components/UserInfo.vue";letname=shallowRef("vue")letinfo=shallowRef({name:"html"})conso......
  • 云端地球如何进行标注导入导出?
    云端地球支持标注导入导出,与Dasviewer、CAD等软件进行数据流转。标注导入1.点击【添加标注组】,在标注组上点击【导入标注】,支持导入GeoJSON,KML,CSV格式文件。2.导入的KML在标注组里以点线面等标注的形式展示,且可进行重新编辑。标注导出1.在模型上进行点、线、面......
  • DataGrip如何导入和导出sql文件
    导出右键选择需要导出的数据库名称,我这里选择的是company然后依次按图操作即可选择好后会弹出一个窗口第一个路径选择mysql根目录下的/bin/mysqldump.exe程序,根据自身情况选择第二个路径为保存路径,我D盘下的mysql_File\DataGrip,名称默认为company.sql导出是提示......
  • NocoBase 本周更新汇总:优化 REST API 数据源插件
    汇总一周产品更新日志,最新发布可以前往我们的博客查看。NocoBase目前更新包括的版本更新包括三个分支:main,next和develop。main:截止目前最稳定的版本,推荐安装此版本。next:包含即将发布的新功能,经过初步测试的版本,可能存在部分已知或未知问题。主要面向测试用户,用于收集反......
  • 企业级短链接生成接口API推荐
    小码短链接API作为一款企业级的短链接生成工具,为企业提供了一系列强大的功能,以满足其复杂的业务需求。在这篇文章中,我们将详细探讨小码短链接API的各项功能,以及为什么它是企业级应用的理想选择。我们还将讨论如何配合自有域名和Webhook推送功能来实现更多功能。小码短链接......
  • 语音转文字-Microsoft Azure Speech Service与Web Speech API实战
    简介在现代技术驱动的世界中,语音识别已成为人机交互的重要方式。MicrosoftAzureSpeechService提供了强大的语音转文本功能,允许开发者轻松地将语音数据转换为文本。本文将指导你如何使用AzureSpeechService实现语音转文本的功能。MicrosoftAzureSpeechService优势:......