119 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { NextRequest, NextResponse } from 'next/server';
import { getServerSession } from 'next-auth';
import { authOptions } from '@/lib/auth';
import { prisma } from '@/lib/prisma';
import { purgeDeletedMaterialsByTaskNo, validateTaskNo } from '@/lib/product-package';
import { getDingtalkApprovalNoError } from '@/lib/dingtalk-approval-no';
// POST - 初始化实拍原图素材记录
export async function POST(request: NextRequest) {
try {
const session = await getServerSession(authOptions);
if (!session) {
return NextResponse.json({ error: '请先登录' }, { status: 401 });
}
const body = await request.json();
const { taskNo, dingtalkApprovalNo, productModel, categoryName, sceneName, platformName, productCategoryName } = body;
// 验证必填字段
if (!productModel || !categoryName || !sceneName) {
return NextResponse.json(
{ error: '缺少必填字段' },
{ status: 400 }
);
}
// 验证任务号格式(如果提供)
if (taskNo) {
if (!validateTaskNo(taskNo)) {
return NextResponse.json(
{ error: '任务号格式错误' },
{ status: 400 }
);
}
// 检查任务号是否已存在(排除已删除的素材)
const existingMaterial = await prisma.material.findFirst({
where: {
taskNo,
deletedAt: null, // 只检查未删除的素材
},
select: { id: true, productModel: true, materialType: true },
});
if (existingMaterial) {
return NextResponse.json(
{ error: `任务号 ${taskNo} 已存在,对应素材:${existingMaterial.productModel}(${existingMaterial.materialType})` },
{ status: 400 }
);
}
try {
const cleanupResult = await purgeDeletedMaterialsByTaskNo(taskNo);
if (cleanupResult.deletedMaterials > 0) {
console.log(`[Real Photo Init] 已清理任务号 ${taskNo} 的旧软删素材 ${cleanupResult.deletedMaterials} 条`);
}
} catch (cleanupError) {
console.error('[Real Photo Init] 清理旧软删素材失败:', cleanupError);
}
}
const dingtalkApprovalNoError = getDingtalkApprovalNoError(dingtalkApprovalNo);
if (dingtalkApprovalNoError) {
return NextResponse.json({ error: dingtalkApprovalNoError }, { status: 400 });
}
// 获取用户信息
const user = await prisma.user.findUnique({
where: { id: (session.user as any).id },
select: { username: true },
});
if (!user) {
return NextResponse.json(
{ error: '用户不存在' },
{ status: 404 }
);
}
// 创建素材记录(使用临时预览图)
const material = await prisma.material.create({
data: {
materialType: '任务-实拍原图',
productModel,
categoryName,
sceneName,
platformName: platformName || '',
productCategoryName: productCategoryName || '',
authorName: user.username,
userId: (session.user as any).id,
previewUrl: '', // 临时空值,完成上传时更新
zipFilePath: '', // 临时空值,完成上传时更新
zipFileName: '', // 临时空值,完成上传时更新
renderer: '', // 实拍原图不需要渲染器
},
});
return NextResponse.json({
success: true,
materialId: material.id,
});
} catch (error: any) {
console.error('[Real Photo Init Error]', error);
// 捕获 Prisma 唯一约束错误(任务号重复)
if (error?.code === 'P2002' && error?.meta?.target?.includes('task_no')) {
return NextResponse.json(
{ error: `任务号已被使用,请检查是否重复提交` },
{ status: 400 }
);
}
return NextResponse.json(
{ error: error.message || '初始化失败' },
{ status: 500 }
);
}
}