45 lines
1.6 KiB
Go
45 lines
1.6 KiB
Go
package purchase
|
|
|
|
import (
|
|
"context"
|
|
|
|
"go-admin/app/goauto/shopeeproduct"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// Called inside the link transaction, after locking the SYB and Shopee rows.
|
|
// Reuse the authoritative stage calculation, without AI or task creation.
|
|
func ValidateQuickReplacement(ctx context.Context, tx *gorm.DB, id uint64) error {
|
|
s := NewService(tx)
|
|
dataset, err := s.loadBatchPreviewDataset(ctx, []uint64{id})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
guard, _, err := s.readOnlyPriceGuard(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
preview := s.previewFromDataset(id, dataset, guard)
|
|
qualification := aiMatchQualificationForDataset(id, dataset)
|
|
preview.AIMatchEligible = qualification.Eligible
|
|
preview.AIMatchDisabledReason = qualification.DisabledReason
|
|
stage := processStageFromDataset(id, dataset, preview)
|
|
syb := dataset.sybByID[id]
|
|
disabled := false
|
|
if syb.ShopeeProductID != nil {
|
|
shopee := dataset.shopeeByID[*syb.ShopeeProductID]
|
|
if shopee.PDDProductID != nil {
|
|
pdd := dataset.pddByID[*shopee.PDDProductID]
|
|
disabled = pdd.Status == "disabled"
|
|
if _, active := dataset.activeCollectionByPDD[pdd.ID]; active {
|
|
return &shopeeproduct.ServiceError{Code: shopeeproduct.CodeLinkConflict, Message: "商品正在采集,请结束后刷新再操作"}
|
|
}
|
|
}
|
|
}
|
|
if stage.NextAction == "open_pdd" && (stage.Stage == ProcessStagePDDPending || stage.Stage == ProcessStagePDDCollectionFail ||
|
|
(stage.Stage == ProcessStageManualAction && (disabled || preview.ReasonCode == "PDD_PRICE_MISSING"))) {
|
|
return nil
|
|
}
|
|
return &shopeeproduct.ServiceError{Code: shopeeproduct.CodeLinkConflict, Message: "处理阶段已变化,当前不能一键替换,请刷新列表"}
|
|
}
|