package exporter import ( "context" "strings" "gorm.io/gorm" "github.com/break/junhong_cmp_fiber/pkg/constants" ) // loadAssociatedPhonesByAsset 按本批资产集合一次 IN 批量读取当前有效关联手机号。 // 两类导出都必须走本方法:逐资产查询会形成 N+1,且导出是分片批处理,批量读是唯一可行口径。 // 同一资产存在多项有效关系时按关系创建顺序以「、」连接为单个单元格;无关联时返回空串。 func loadAssociatedPhonesByAsset(ctx context.Context, db *gorm.DB, assetType string, assetIDs []uint) (map[uint]string, error) { cells := make(map[uint]string, len(assetIDs)) if len(assetIDs) == 0 { return cells, nil } var rows []struct { AssetID uint `gorm:"column:asset_id"` Phone string `gorm:"column:phone"` } if err := db.WithContext(ctx).Table("tb_phone_asset_association"). Select("asset_id", "phone"). Where("asset_type = ? AND status = ? AND asset_id IN ?", assetType, constants.PhoneAssetAssociationStatusValid, assetIDs). Order("asset_id ASC, id ASC"). Scan(&rows).Error; err != nil { return nil, err } grouped := make(map[uint][]string, len(rows)) for _, row := range rows { grouped[row.AssetID] = append(grouped[row.AssetID], row.Phone) } for assetID, phones := range grouped { cells[assetID] = strings.Join(phones, "、") } return cells, nil }