Optimize falukantService and DirectorInfo component for improved performance and user experience

- Refactored proposal handling in falukantService to load existing proposals before cleaning expired ones, reducing unnecessary database queries.
- Enhanced fetchProposals method with explicit joins for better performance and added a limit to avoid excessive data retrieval.
- Updated DirectorInfo component to reload data after hiring a director, ensuring the UI reflects the latest information.
This commit is contained in:
Torsten Schulz (local)
2026-01-22 10:15:45 +01:00
parent 3018b1f2e1
commit 8c0f07cc51
2 changed files with 42 additions and 6 deletions

View File

@@ -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,
});
}

View File

@@ -181,7 +181,7 @@
</div>
</div>
</div>
<NewDirectorDialog ref="newDirectorDialog" />
<NewDirectorDialog ref="newDirectorDialog" @directorHired="handleDirectorHired" />
</template>
<script>
@@ -276,6 +276,11 @@ export default {
this.$refs.newDirectorDialog.open(this.branchId);
},
async handleDirectorHired() {
// Nach dem Einstellen eines Direktors die Daten neu laden
await this.loadDirector();
},
async updateDirector() {
if (!this.director || this.editIncome == null) return;
try {