2026-05-07 16:37:22 +08:00

115 lines
3.1 KiB
TypeScript

'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 })
}
}