package service import ( "database/sql" "fmt" "sort" "strings" "time" "cmautobuy/admin/model" "cmautobuy/admin/repository" ) func normalizeShopeeIDs(ids []string) []string { seen := map[string]struct{}{} result := make([]string, 0, len(ids)) for _, id := range ids { id = strings.TrimSpace(id) if id == "" { continue } if _, ok := seen[id]; ok { continue } seen[id] = struct{}{} result = append(result, id) } sort.Strings(result) return result } // DeleteShopeeProducts 由管理员把商品移入可恢复的删除状态。 func DeleteShopeeProducts(db *sql.DB, actor *model.User, ids []string) (int64, error) { if actor == nil || !actor.IsAdmin() { return 0, ErrAdminRequired } ids = normalizeShopeeIDs(ids) if len(ids) == 0 { return 0, invalidInput("没有勾选任何蝦皮商品") } tx, err := db.Begin() if err != nil { return 0, err } defer tx.Rollback() busy, err := repository.ShopeeProductsWithActiveTasks(tx, ids) if err != nil { return 0, err } if len(busy) > 0 { return 0, invalidInput(fmt.Sprintf("商品 %s 仍有进行中的采集或采购任务,不能删除", strings.Join(busy, "、"))) } count, err := repository.SetShopeeProductsDeleted(tx, ids, actor.UserID, time.Now().UTC().Format(model.TimeLayout)) if err != nil { return 0, err } return count, tx.Commit() } // RestoreShopeeProducts 由管理员恢复软删除商品,原 SKU 和 PDD 关联保持不变。 func RestoreShopeeProducts(db *sql.DB, actor *model.User, ids []string) (int64, error) { if actor == nil || !actor.IsAdmin() { return 0, ErrAdminRequired } ids = normalizeShopeeIDs(ids) if len(ids) == 0 { return 0, invalidInput("没有勾选任何蝦皮商品") } tx, err := db.Begin() if err != nil { return 0, err } defer tx.Rollback() count, err := repository.SetShopeeProductsDeleted(tx, ids, actor.UserID, "") if err != nil { return 0, err } return count, tx.Commit() }