feat(t241): improve freight admin views

This commit is contained in:
QiuSW
2026-07-29 15:34:51 +08:00
parent 8b0752dc53
commit 7e3aaac982
14 changed files with 451 additions and 105 deletions
@@ -90,6 +90,12 @@ func TestFreightItemImagesAreCurrentRetryableAndRollbackGuarded(
t.Fatalf("retry jobs = %+v, %v", jobs, err)
}
orders, _ := store.ListFreightOrders(ctx, "local-admin", 10)
if len(orders) != 1 ||
orders[0].PreviewItemID != ready.FreightOrderItemID ||
orders[0].PreviewTitle != "商品一" ||
orders[0].PreviewImageStatus != domain.FreightItemImageReady {
t.Fatalf("freight order preview = %+v", orders)
}
detail, err := store.GetFreightOrder(
ctx,
"local-admin",
@@ -488,21 +488,80 @@ func (store *Store) ListFreightOrders(
if err != nil {
return nil, repositoryFailure(err)
}
defer rows.Close()
orders := make([]domain.FreightOrder, 0)
for rows.Next() {
order, err := scanFreightOrder(rows)
if err != nil {
rows.Close()
return nil, repositoryFailure(err)
}
orders = append(orders, order)
}
if err := rows.Err(); err != nil {
rows.Close()
return nil, repositoryFailure(err)
}
if err := rows.Close(); err != nil {
return nil, repositoryFailure(err)
}
for index := range orders {
if err := store.loadFreightOrderPreview(
ctx,
&orders[index],
); err != nil {
return nil, err
}
}
return orders, nil
}
func (store *Store) loadFreightOrderPreview(
ctx context.Context,
order *domain.FreightOrder,
) error {
var itemID, title string
var itemThumb, imageThumb, imageStatus sql.NullString
err := store.db.QueryRowContext(
ctx,
`SELECT item.id, item.title, item.product_thumb_ref,
image.product_thumb_ref, image.status
FROM freight_order_items AS item
LEFT JOIN freight_item_images AS image
ON image.freight_order_item_id = item.id
WHERE item.freight_order_id = ? AND item.is_present = 1
ORDER BY CAST(item.external_item_id AS INTEGER),
item.external_item_id
LIMIT 1`,
order.ID,
).Scan(
&itemID,
&title,
&itemThumb,
&imageThumb,
&imageStatus,
)
if errors.Is(err, sql.ErrNoRows) {
return nil
}
if err != nil {
return repositoryFailure(err)
}
order.PreviewItemID = itemID
order.PreviewTitle = title
switch {
case !itemThumb.Valid:
order.PreviewImageStatus = domain.FreightItemImageNone
case imageThumb.Valid && imageStatus.Valid &&
imageThumb.String == itemThumb.String:
order.PreviewImageStatus = domain.FreightItemImageStatus(
imageStatus.String,
)
default:
order.PreviewImageStatus = domain.FreightItemImagePending
}
return nil
}
func (store *Store) GetFreightOrder(
ctx context.Context,
creatorSubject, orderID string,