2025-06-16 00:52:49 +08:00

174 lines
4.9 KiB
JavaScript

import { PrismaClient } from '@prisma/client';
import { v4 as uuidv4 } from 'uuid';
// Initialize Prisma client
const prisma = new PrismaClient();
export default defineEventHandler(async (event) => {
try {
// Get the process ID from the route parameter
const processId = getRouterParam(event, 'id');
if (!processId) {
return {
success: false,
error: 'Process ID is required'
};
}
console.log('Starting process with ID:', processId);
// Check if the ID is a UUID or numeric ID
const isUUID = processId.length === 36 && processId.includes('-');
// Find the process
console.log('Finding process...');
const process = await prisma.process.findFirst({
where: isUUID
? { processUUID: processId }
: { processID: parseInt(processId) },
include: {
creator: {
select: {
userID: true,
userFullName: true,
userUsername: true
}
}
}
});
if (!process) {
console.log('Process not found');
return {
success: false,
error: 'Process not found'
};
}
console.log('Process found:', process.processName);
// Check if process is published
if (process.processStatus !== 'published') {
console.log('Process is not published:', process.processStatus);
return {
success: false,
error: 'Cannot start an unpublished process'
};
}
// Get the current user (in a real app, this would come from the authenticated user)
const currentUser = {
userID: 1, // This would be the actual user ID in a real app
userFullName: 'John Doe',
userUsername: 'johndoe'
};
console.log('Creating case instance...');
// Create a new case instance
const caseInstance = await prisma.caseInstance.create({
data: {
caseUUID: uuidv4(),
processID: process.processID,
caseName: `${process.processName} - ${new Date().toLocaleDateString()}`,
caseStatus: 'active',
caseStartedBy: currentUser.userID,
caseVariables: process.processVariables || {},
caseSettings: process.processSettings || {},
caseDefinition: process.processDefinition || {},
caseCreatedDate: new Date(),
caseModifiedDate: new Date()
}
});
console.log('Case instance created:', caseInstance.caseUUID);
// Get the process definition
const processDefinition = process.processDefinition || {};
const nodes = processDefinition.nodes || [];
const edges = processDefinition.edges || [];
// Find all form nodes
const formNodes = nodes.filter(node => node.type === 'form');
if (formNodes.length === 0) {
console.log('No form nodes found in process');
return {
success: false,
error: 'Process does not contain any forms'
};
}
console.log(`Found ${formNodes.length} form nodes`);
// Create tasks for all forms
const tasks = [];
for (const formNode of formNodes) {
console.log('Creating task for form:', formNode.data?.label);
const task = await prisma.task.create({
data: {
taskUUID: uuidv4(),
caseID: caseInstance.caseID,
taskName: formNode.data?.label || 'Complete Form',
taskType: 'form',
taskStatus: 'pending',
taskAssignedTo: currentUser.userID,
taskFormID: formNode.data?.formId,
taskCreatedDate: new Date(),
taskModifiedDate: new Date()
}
});
tasks.push(task);
console.log('Task created:', task.taskUUID);
}
// Add to case timeline
console.log('Adding to case timeline...');
await prisma.caseTimeline.create({
data: {
caseID: caseInstance.caseID,
timelineType: 'start',
timelineDescription: `Process started by ${currentUser.userFullName}`,
timelineDate: new Date(),
timelineCreatedBy: currentUser.userID
}
});
console.log('Process started successfully');
return {
success: true,
data: {
case: {
id: caseInstance.caseUUID,
name: caseInstance.caseName,
status: caseInstance.caseStatus,
startedAt: caseInstance.caseCreatedDate
},
tasks: tasks.map(task => ({
id: task.taskUUID,
name: task.taskName,
type: task.taskType,
formId: task.taskFormID,
status: task.taskStatus
}))
}
};
} catch (error) {
console.error('Error starting process:', error);
console.error('Error details:', {
name: error.name,
message: error.message,
stack: error.stack,
code: error.code
});
return {
success: false,
error: 'Failed to start process',
details: process.env.NODE_ENV === 'development' ? error.message : undefined
};
} finally {
// Close the Prisma client connection
await prisma.$disconnect();
}
});