package csv import ( "joybuywork/internal/plugins/export" ) const ( FlushNum = 200 // csv写入多少行后从缓冲区写入文件 ) type Task struct { export.BaseTask *Export } // UpgradeTask csv导出升级成任务模式 func (e *Export) UpgradeTask(opts ...export.TaskOption) (*Task, error) { task := &Task{ Export: e, } //初始化任务 task.Init(e.Ctx, task, opts...) //初始化任务文件 err := task.initFile() if err != nil { return nil, err } return task, nil } // 写入csv表格 func (t *Task) writeRow(v []string) error { //写入文件 t.FrAdd() //不能写入当前行数据 if !t.CanWriteRow() { return nil } err := t.w.Write(v) if err != nil { return err } if t.GetFr()%FlushNum == 0 || t.GetFr() >= t.GetTotal() { // 到达缓冲区最大实现条数或者写入了最后一条 t.w.Flush() } //看看任务有没有完成 t.CheckFinish() return nil } // WriteData 写入数据 func (t *Task) WriteData(data []export.RowData) (err error) { list := t.getList(data) for _, v := range list { err = t.writeRow(v) if err != nil { return } } return } // FileClose 关闭资源 func (t *Task) FileClose() { _ = t.file.Close() } // GetTotal 获取导出总条数 func (t *Task) GetTotal() int64 { return t.Total }