fix(street): 晋升时重建副图父引用(草稿行 id 到 正式行 id)
This commit is contained in:
@ -449,22 +449,74 @@ func (r *reviewRepository) SaveStreetSnapFromDraft(ctx context.Context, draftID
|
||||
return dErr
|
||||
}
|
||||
if len(imgs) > 0 {
|
||||
rows := make([]model.StreetSnapImage, 0, len(imgs))
|
||||
for i, im := range imgs {
|
||||
rows = append(rows, model.StreetSnapImage{
|
||||
SnapID: snapID,
|
||||
Image: im.Image,
|
||||
Name: im.Name,
|
||||
SortOrder: uint32(i + 1),
|
||||
Phash: im.Phash,
|
||||
IsDuplicate: im.IsDuplicate,
|
||||
DupOf: im.DupOf,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: now,
|
||||
})
|
||||
// 第一遍:插入主图(is_detail=0),并记下「草稿行 id → 新正式行 id」的映射。
|
||||
//
|
||||
// 必须两遍插入:副图的 parent_image_id 存的是**草稿表**的行 id,
|
||||
// 而这里插入的正式行拿到的是全新 id。若先插副图,父引用就会指向草稿表的旧 id,
|
||||
// 详情页折叠结构随之错乱(见计划「任务 2」标题下的说明)。
|
||||
newIDByDraftID := make(map[uint32]uint32, len(imgs))
|
||||
mains := make([]model.StreetSnapImage, 0, len(imgs))
|
||||
for _, im := range imgs {
|
||||
if im.IsDetail == 1 {
|
||||
continue
|
||||
}
|
||||
mains = append(mains, model.StreetSnapImage{
|
||||
SnapID: snapID,
|
||||
Image: im.Image,
|
||||
Name: im.Name,
|
||||
SortOrder: uint32(len(mains) + 1),
|
||||
IsDetail: 0,
|
||||
Phash: im.Phash,
|
||||
IsDuplicate: im.IsDuplicate,
|
||||
DupOf: im.DupOf,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: now,
|
||||
})
|
||||
}
|
||||
if cErr := tx.Create(&rows).Error; cErr != nil {
|
||||
return cErr
|
||||
for i := range mains {
|
||||
if cErr := tx.Create(&mains[i]).Error; cErr != nil {
|
||||
return cErr
|
||||
}
|
||||
}
|
||||
mainIdx := 0
|
||||
for _, im := range imgs {
|
||||
if im.IsDetail == 1 {
|
||||
continue
|
||||
}
|
||||
newIDByDraftID[im.ID] = mains[mainIdx].ID
|
||||
mainIdx++
|
||||
}
|
||||
|
||||
// 第二遍:插入副图,把父引用改写成新主图行 id。
|
||||
details := make([]model.StreetSnapImage, 0, len(imgs)-len(mains))
|
||||
for _, im := range imgs {
|
||||
if im.IsDetail != 1 {
|
||||
continue
|
||||
}
|
||||
newParent, ok := newIDByDraftID[im.ParentImageID]
|
||||
row := model.StreetSnapImage{
|
||||
SnapID: snapID,
|
||||
Image: im.Image,
|
||||
Name: im.Name,
|
||||
SortOrder: uint32(len(mains) + len(details) + 1),
|
||||
IsDetail: 1,
|
||||
Phash: im.Phash,
|
||||
IsDuplicate: im.IsDuplicate,
|
||||
DupOf: im.DupOf,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: now,
|
||||
}
|
||||
if ok {
|
||||
row.ParentImageID = newParent
|
||||
} else {
|
||||
row.IsDetail = 0 // 父行缺失:按主图渲染,与读侧容错口径一致
|
||||
}
|
||||
details = append(details, row)
|
||||
}
|
||||
if len(details) > 0 {
|
||||
if cErr := tx.Create(&details).Error; cErr != nil {
|
||||
return cErr
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user