Afiq 577128a799 Optimize Conditional Logic Handling and Introduce Demo Component
- Refactored ConditionalLogicEngine.vue to optimize conditional logic script generation by grouping handlers for watched fields, reducing duplicate event listeners and improving performance.
- Added helper functions for generating condition checks and action codes, enhancing code readability and maintainability.
- Introduced ConditionalLogicTestDemo.vue to demonstrate the benefits of optimization, showcasing before and after examples of conditional logic handling.
- Updated FormBuilderFieldSettingsModal.vue to include notes on optimization when multiple fields watch the same trigger field, improving user awareness of performance enhancements.
- Enhanced ComponentPreview.vue and workflow pages to support preview mode for conditional logic, ensuring consistent behavior across the application.
2025-08-06 18:31:56 +08:00

130 lines
3.6 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);
console.log('Process started successfully - tasks will be created dynamically during workflow execution');
// 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
}
}
};
} 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();
}
});