115 lines
3.1 KiB
TypeScript
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 })
|
|
}
|
|
}
|