package copydata import ( consts "cid/consts/public" dto "cid/model/dto/copydata" entity "cid/model/entity/copydata" "context" "errors" "gitea.com/red-future/common/db/gfdb" "github.com/gogf/gf/v2/util/gconv" ) var UnitReportDetail = new(UnitReportDetailDao) type UnitReportDetailDao struct{} // Insert 插入广告效果指标详情 func (d *UnitReportDetailDao) Insert(ctx context.Context, req *dto.UnitReportDetailItem) (id int64, err error) { var entityData *entity.UnitReportDetail if err = gconv.Struct(req, &entityData); err != nil { return } r, err := gfdb.DB(ctx).Model(ctx, consts.UnitReportDetailTable).Data(&entityData).Insert() if err != nil { return } return r.LastInsertId() } // BatchInsert 批量插入广告效果指标详情 func (d *UnitReportDetailDao) BatchInsert(ctx context.Context, reqs []*dto.UnitReportDetailItem) (successCount int64, failCount int64, failedIndexes []int64, err error) { if len(reqs) == 0 { return 0, 0, nil, errors.New("批量插入数据不能为空") } batchSize := 100 successCount = 0 failCount = 0 failedIndexes = make([]int64, 0) for i := 0; i < len(reqs); i += batchSize { end := i + batchSize if end > len(reqs) { end = len(reqs) } batch := reqs[i:end] entityList := make([]*entity.UnitReportDetail, len(batch)) for j, req := range batch { var entityData entity.UnitReportDetail if err = gconv.Struct(req, &entityData); err != nil { failCount++ failedIndexes = append(failedIndexes, int64(i+j)) continue } entityList[j] = &entityData } if len(entityList) == 0 { continue } _, err = gfdb.DB(ctx).Model(ctx, consts.UnitReportDetailTable).Data(entityList).Insert() if err != nil { for k := range batch { _, singleErr := d.Insert(ctx, batch[k]) if singleErr != nil { failCount++ failedIndexes = append(failedIndexes, int64(i+k)) } else { successCount++ } } } else { successCount += int64(len(entityList)) } } return successCount, failCount, failedIndexes, nil }