You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.3 KiB
Go
79 lines
1.3 KiB
Go
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
|
|
}
|