'use server' import { NextRequest, NextResponse } from 'next/server' import { getServerSession } from 'next-auth' import { authOptions } from '@/lib/auth' import { prisma } from '@/lib/prisma' import { createMaterialLog } from '@/lib/material-log' // 批量更新 SKU 排序 export async function PUT( request: NextRequest, { params }: { params: { id: string } } ) { try { const session = await getServerSession(authOptions) if (!session?.user || !(session.user as any).id) { return NextResponse.json({ error: '请先登录' }, { status: 401 }) } const materialId = params.id // 检查素材是否存在 const material = await prisma.material.findUnique({ where: { id: materialId }, select: { id: true, userId: true } }) if (!material) { return NextResponse.json({ error: '素材不存在' }, { status: 404 }) } const userId = (session.user as any).id; const body = await request.json() const { skuIds } = body // 按新顺序排列的 SKU ID 数组 if (!Array.isArray(skuIds) || skuIds.length === 0) { return NextResponse.json({ error: '请提供 SKU ID 列表' }, { status: 400 }) } const existingSkus = await prisma.materialSku.findMany({ where: { id: { in: skuIds }, materialId, deletedAt: null, }, select: { id: true, skuName: true, sortOrder: true, }, }) if (existingSkus.length !== skuIds.length) { return NextResponse.json({ error: '部分 SKU 不存在或不属于该素材' }, { status: 400 }) } const oldOrder = [...existingSkus] .sort((a, b) => a.sortOrder - b.sortOrder) .map((sku) => sku.id) const oldOrderMap = new Map(existingSkus.map((sku) => [sku.id, sku])) // 批量更新排序 const updates = skuIds.map((skuId: string, index: number) => prisma.materialSku.update({ where: { id: skuId }, data: { sortOrder: index } }) ) await prisma.$transaction(updates) const changedItems = skuIds .map((skuId, index) => { const previous = oldOrderMap.get(skuId) if (!previous || previous.sortOrder === index) return null return { skuId, skuName: previous.skuName, oldSortOrder: previous.sortOrder, newSortOrder: index, } }) .filter((item): item is { skuId: string; skuName: string; oldSortOrder: number; newSortOrder: number } => item !== null) if (changedItems.length > 0) { await createMaterialLog({ materialId, userId, action: 'UPDATE', changes: { skuOperation: { oldValue: null, newValue: 'REORDER', }, skuOrder: { oldValue: oldOrder, newValue: skuIds, }, changedItems: { oldValue: null, newValue: changedItems, }, }, }) } return NextResponse.json({ success: true, message: '排序已更新' }) } catch (error) { console.error('更新 SKU 排序失败:', error) return NextResponse.json({ error: '更新排序失败' }, { status: 500 }) } }