package exporter import ( "context" "strconv" "gorm.io/gorm" "github.com/break/junhong_cmp_fiber/internal/model" "github.com/break/junhong_cmp_fiber/pkg/constants" ) // DeviceSceneStrategy 设备导出场景策略。 type DeviceSceneStrategy struct { db *gorm.DB } // NewDeviceSceneStrategy 创建设备场景策略。 func NewDeviceSceneStrategy(db *gorm.DB) *DeviceSceneStrategy { return &DeviceSceneStrategy{db: db} } // Scene 场景编码。 func (s *DeviceSceneStrategy) Scene() string { return constants.ExportTaskSceneDevice } // Headers 导出表头。 func (s *DeviceSceneStrategy) Headers() []string { return []string{"ID", "设备虚拟号", "设备名称", "设备型号", "设备类型", "状态", "店铺ID", "创建时间"} } // NextShardBoundary 获取下一段分片边界。 func (s *DeviceSceneStrategy) NextShardBoundary(ctx context.Context, task *model.ExportTask, afterID uint64, limit int) (*ShardBoundary, error) { if limit <= 0 { limit = constants.ExportDefaultShardSize } var ids []uint64 query := s.db.WithContext(ctx). Model(&model.Device{}). Where("id > ?", afterID). Order("id ASC"). Limit(limit) query = applyShopScopeForTask(query, task) if err := query.Pluck("id", &ids).Error; err != nil { return nil, err } if len(ids) == 0 { return nil, nil } return &ShardBoundary{ StartID: afterID, EndID: ids[len(ids)-1], RowCount: len(ids), }, nil } // QueryRows 查询分片内数据行。 func (s *DeviceSceneStrategy) QueryRows(ctx context.Context, task *model.ExportTask, startID, endID uint64) ([][]string, error) { if endID == 0 { return [][]string{}, nil } var devices []model.Device query := s.db.WithContext(ctx). Model(&model.Device{}). Where("id > ? AND id <= ?", startID, endID). Order("id ASC") query = applyShopScopeForTask(query, task) if err := query.Find(&devices).Error; err != nil { return nil, err } rows := make([][]string, 0, len(devices)) for _, item := range devices { shopID := "" if item.ShopID != nil { shopID = strconv.FormatUint(uint64(*item.ShopID), 10) } rows = append(rows, []string{ strconv.FormatUint(uint64(item.ID), 10), item.VirtualNo, item.DeviceName, item.DeviceModel, item.DeviceType, strconv.Itoa(item.Status), shopID, item.CreatedAt.Format("2006-01-02 15:04:05"), }) } return rows, nil }