diff --git a/backend/services/falukantService.js b/backend/services/falukantService.js
index b07fae1..08d0466 100644
--- a/backend/services/falukantService.js
+++ b/backend/services/falukantService.js
@@ -2412,11 +2412,20 @@ class FalukantService extends BaseService {
throw new Error('Branch not found or does not belong to the user');
}
const { falukantUserId, regionId } = branch;
- await this.deleteExpiredProposals();
+
+ // OPTIMIERUNG: Erst Proposals laden, dann nur bei Bedarf bereinigen
+ // Dies vermeidet unnötige DELETE-Queries bei jedem Aufruf
const existingProposals = await this.fetchProposals(falukantUserId, regionId);
if (existingProposals.length > 0) {
+ // Nur bereinigen, wenn wir Proposals haben (im Hintergrund, nicht blockierend)
+ this.deleteExpiredProposals().catch(err =>
+ console.error('[getDirectorProposals] Error cleaning expired proposals:', err)
+ );
return this.formatProposals(existingProposals);
}
+
+ // Wenn keine Proposals vorhanden sind, bereinigen wir vor der Generierung
+ await this.deleteExpiredProposals();
await this.generateProposals(falukantUserId, regionId);
const newProposals = await this.fetchProposals(falukantUserId, regionId);
return this.formatProposals(newProposals);
@@ -2434,6 +2443,8 @@ class FalukantService extends BaseService {
}
async fetchProposals(falukantUserId, regionId) {
+ // OPTIMIERUNG: Query mit expliziten Joins und required: true für bessere Performance
+ // required: true sorgt für INNER JOIN statt LEFT JOIN, was schneller ist
return DirectorProposal.findAll({
where: { employerUserId: falukantUserId },
include: [
@@ -2442,20 +2453,40 @@ class FalukantService extends BaseService {
as: 'character',
attributes: ['firstName', 'lastName', 'birthdate', 'titleOfNobility', 'gender'],
where: { regionId },
+ required: true, // INNER JOIN für bessere Performance
include: [
- { model: FalukantPredefineFirstname, as: 'definedFirstName' },
- { model: FalukantPredefineLastname, as: 'definedLastName' },
- { model: TitleOfNobility, as: 'nobleTitle' },
+ {
+ model: FalukantPredefineFirstname,
+ as: 'definedFirstName',
+ required: false // LEFT JOIN, da optional
+ },
+ {
+ model: FalukantPredefineLastname,
+ as: 'definedLastName',
+ required: false // LEFT JOIN, da optional
+ },
+ {
+ model: TitleOfNobility,
+ as: 'nobleTitle',
+ required: false // LEFT JOIN, da optional
+ },
{
model: Knowledge,
as: 'knowledges',
+ required: false, // LEFT JOIN, da optional
include: [
- { model: ProductType, as: 'productType' },
+ {
+ model: ProductType,
+ as: 'productType',
+ required: false // LEFT JOIN, da optional
+ },
]
},
],
},
],
+ // OPTIMIERUNG: Limit setzen, um unnötige Daten zu vermeiden
+ limit: 10,
});
}
diff --git a/frontend/src/components/falukant/DirectorInfo.vue b/frontend/src/components/falukant/DirectorInfo.vue
index 6144579..68c0d39 100644
--- a/frontend/src/components/falukant/DirectorInfo.vue
+++ b/frontend/src/components/falukant/DirectorInfo.vue
@@ -181,7 +181,7 @@
-
+