fix(listing): 修复编号序列冲突并按角色隔离价格字段

This commit is contained in:
yml2213
2026-10-31 13:55:13 +08:00
parent 3ea02661ea
commit 8bd6d7fe8f
3 changed files with 50 additions and 3 deletions
@@ -57,6 +57,7 @@ func normalizedListingPriceCent(req CreateRequest) int64 {
func publicListings(items []ListingDTO) []ListingDTO {
for index := range items {
applyPublicListingURLs(&items[index])
applyPublicListingPrice(&items[index])
}
return items
}
@@ -156,12 +157,47 @@ func applySellerListingPrice(item *ListingDTO) {
item.AssetSummary["publish_ratio"] = sellerRatio
}
delete(breakdown, "buyer_coin_base_price")
delete(breakdown, "buyer_coin_base_price_cent")
delete(breakdown, "buyer_total_price")
delete(breakdown, "buyer_total_price_cent")
delete(breakdown, "buyer_ratio")
delete(breakdown, "buyer_ratio_bps")
delete(breakdown, "platform_markup_amount")
delete(breakdown, "platform_markup_amount_cent")
delete(breakdown, "platform_rule_type")
}
// applyPublicListingPrice 只保留买家侧价格字段,隐藏卖家成本与平台加价。
func applyPublicListingPrice(item *ListingDTO) {
if item == nil || item.AssetSummary == nil {
return
}
breakdown, ok := item.AssetSummary["price_breakdown"].(map[string]any)
if !ok {
return
}
for _, key := range []string{
"seller_reference_ratio",
"seller_reference_ratio_bps",
"seller_ratio",
"seller_ratio_bps",
"seller_coin_base_price",
"seller_coin_base_price_cent",
"seller_total_price",
"seller_total_price_cent",
"platform_markup_amount",
"platform_markup_amount_cent",
"platform_rule_type",
"admin_adjust_reason",
"admin_adjusted_at",
"admin_adjusted_by",
"site_receive_ratio_delta",
"site_receive_cost_delta",
} {
delete(breakdown, key)
}
}
func (row listingRow) toDTO() ListingDTO {
assetSummary := decodeAssetSummary(row.AssetSummary)
screenshotURLS := cleanScreenshotURLs(decodeScreenshots(row.ScreenshotURLS))
@@ -239,6 +239,7 @@ func (r *Repository) FindPublic(ctx context.Context, id uint64, siteCode string)
return nil, err
}
applyPublicListingURLs(dto)
applyPublicListingPrice(dto)
items := []ListingDTO{*dto}
if err := r.applyShelfMarkup(ctx, siteCode, items); err != nil {
return nil, err
+13 -3
View File
@@ -258,11 +258,21 @@ func (r *Repository) findForReviewUpdate(tx *gorm.DB, listingID uint64) (*model.
func (r *Repository) nextListingNo(tx *gorm.DB, now time.Time) (string, error) {
bizDate := now.Format("20060102")
if tx.Dialector.Name() == "mysql" {
// 以当天已有编号的最大值为兜底,避免种子数据或外部写入后序列落后导致编号冲突。
var maxSeq int
if err := tx.Raw(
`SELECT COALESCE(MAX(CAST(SUBSTRING(listing_no, 9) AS UNSIGNED)), 0)
FROM rental_listings WHERE listing_no LIKE ?`,
bizDate+"%",
).Scan(&maxSeq).Error; err != nil {
return "", err
}
nextSeq := maxSeq + 1
if err := tx.Exec(`
INSERT INTO listing_no_sequences (biz_date, next_seq)
VALUES (?, LAST_INSERT_ID(1))
ON DUPLICATE KEY UPDATE next_seq = LAST_INSERT_ID(next_seq + 1)
`, bizDate).Error; err != nil {
VALUES (?, LAST_INSERT_ID(?))
ON DUPLICATE KEY UPDATE next_seq = LAST_INSERT_ID(GREATEST(next_seq + 1, ?))
`, bizDate, nextSeq, nextSeq).Error; err != nil {
return "", err
}
var seq int