嗨,我做了一个计算得分得分算法,我在salairenet中有一个错误
错误类型错误:无法在HTMLButtonElement的executeListenerIn_markDirtyAndPreventDefault(core. mjs:14024:22)处读取ScoringComponent.calculateScore(scoring.component.ts:33:55)处的ScoringComponent_Template_button_click_72_listener(scoring.component.html:65:56)处的executeListenerWithErrorHandling(core. mjs:13991:16)处的null(阅读'salaireNet')的属性。(platform-browser.mjs:457:38)at _ZoneDelegate.invokeTask(zone.js:409:31)at core.mjs:23892:55 at AsyncStackTaggingZoneSpec.onInvokeTask(core.mjs:23892:36)at _ZoneDelegate.invokeTask(zone.js:408:60)at Object.onInvokeTask(
这个问题怎么解决?
评分.component.html
<div class="titre">
<h1>Génération de score</h1></div>
<div class="container">
<div class="employee-details">
<h2 class="client-name">{{demande.client.nom}} {{demande.client.prenom}}</h2>
<p class="client-num">{{demande.client.cin}}</p>
<div class="employee-info">
<div class="info-block">
<span class="info-label">Num Compte:</span>
<span class="info-value">{{demande.client.numCompte}}</span>
</div>
<div class="info-block">
<span class="info-label">Date Naissance:</span>
<span class="info-value" >{{demande.client.dateNai}}</span>
</div>
<div class="info-block">
<span class="info-label">Etat Civil:</span>
<span class="info-value" >{{demande.client.etatCivil}}</span>
</div>
<div class="info-block">
<span class="info-label">Profession:</span>
<span class="info-value" >{{demande.client.profession}}</span>
</div>
<div class="info-block">
<span class="info-label">Type d'hébergement:</span>
<span class="info-value" >{{demande.client.typeHeber}}</span>
</div>
<div class="info-block">
<span class="info-label">Genre:</span>
<span class="info-value" >{{demande.client.genre}}</span>
</div>
<div class="info-block">
<span class="info-label">Salaire NET:</span>
<span class="info-value" >{{demande.client.salNet}}</span>
</div>
<div class="info-block">
<span class="info-label">Montant de crédit:</span>
<span class="info-value" >{{demande.montant}}</span>
</div>
<div class="info-block">
<span class="info-label">Durée de rembourssement:</span>
<span class="info-value" >{{demande.dureeRem}}</span>
</div>
<div class="info-block">
<span class="info-label">Périodicite:</span>
<span class="info-value" >{{demande.periodicite}}</span>
</div>
<div class="info-block">
<span class="info-label">Nombre enfant à charger:</span>
<span class="info-value" >{{demande.client.nbEnfants}}</span>
</div>
<div class="info-block">
<span class="info-label">Salaire NET du conjoint:</span>
<span class="info-value" >{{demande.client.conjoint.salaireNet}}</span>
</div>
<div class="border"></div>
<div class="space"></div>
<button mat-flat-button class="b2" (click)="calculateScore()" >calculer score</button></div>
</div>
</div>
scoring.component.ts
import { HttpClient } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { Demande } from '../models/Demande';
@Component({
selector: 'app-scoring',
templateUrl: './scoring.component.html',
styleUrls: ['./scoring.component.css']
})
export class ScoringComponent implements OnInit {
constructor(private httpClient:HttpClient, private route:ActivatedRoute,private router:Router){}
id!:number;
demande!:Demande;
ngOnInit(): void {
const idParam=this.route.snapshot.paramMap.get('id');
if(idParam !== null){
this.id=Number(idParam);
this.httpClient.get<Demande>('http://localhost:9090/demande/getDemande/'+this.id,{ withCredentials: true }).subscribe((response) => {
//console.log(response);
this.demande=response;
});
}
}
calculateScore() {
const genre = this.demande.client.genre;
const dateNai = this.demande.client.dateNai;
const salNet = this.demande.client.salNet;
const etatCivil = this.demande.client.etatCivil;
const salaireNet = this.demande.client.conjoint.salaireNet | 0;
const montant= this.demande.montant;
const dureeRem= this.demande.dureeRem;
const periodicite= this.demande.periodicite;
const nbEnfants= this.demande.client.nbEnfants;
const typeHeber=this.demande.client.typeHeber;
const profession=this.demande.client.profession
// Appeler la fonction d'algorithme de scoring en passant les valeurs des attributs
const score = this.calculateScoreAlgorithm(genre, dateNai, salNet, etatCivil, salaireNet,montant,dureeRem,periodicite,nbEnfants,typeHeber,profession);
console.log('Score:', score);
}
calculateScoreAlgorithm(genre:string, dateNai:Date, salNet:number, etatCivil:string, salaireNet:number,montant:number,dureeRem:string,periodicite:string,nbEnfants:number,typeHeber:string,profession:string):number{
let score = 0;
if (genre === 'femme' && etatCivil==='Célibataire') {
score += 20;
}
if (genre === 'femme' && etatCivil==='veuf(veuve)') {
if(nbEnfants==0){
score +=15;
}else if(nbEnfants==1){
score +=10;
}else if(nbEnfants==2){
score +=8;
}else if(nbEnfants==3){
score +=6;
}else{score +=3;}
}
if (genre === 'femme' && etatCivil==='Divorcé(e)') {
if(nbEnfants=0){
score +=15;
}else if(nbEnfants==1){
score +=10;
}else if(nbEnfants==2){
score +=8;
}else if(nbEnfants==3){
score +=6;
}else{score +=3;}
}
if (genre === 'femme' && etatCivil==='Marié(e)'&& nbEnfants==0 ) {
if (salaireNet !== null) {
if (700>salaireNet && salaireNet< 1000) {
score += 3;
}else if(1000>salaireNet && salaireNet<1500){
score +=6;
}else if(1500>salaireNet && salaireNet<2000){
score +=8;
}else if(2000>salaireNet && salaireNet<3000){
score+=15;
}else if(salaireNet>3000){
score +=20;
}}else{score+=1;}
}
if (genre === 'femme' && etatCivil==='Marié(e)'&& nbEnfants>0 ) {
if (salaireNet !== null) {
if (700>salaireNet && salaireNet< 1000) {
score += 2;
}else if(1000>salaireNet && salaireNet<1500){
score +=4;
}else if(1500>salaireNet && salaireNet<2000){
score +=6;
}else if(2000>salaireNet && salaireNet<3000){
score+=10;
}else if(salaireNet>3000){
score +=13;
}}else{score +=1;}
}
if (genre === 'homme' && etatCivil==='Célibataire') {
score += 15;
}
if (genre === 'homme' && etatCivil==='veuf(veuve)') {
if(nbEnfants==0){
score +=13;
}else if(nbEnfants==1){
score +=8;
}else if(nbEnfants==2){
score +=6;
}else if(nbEnfants==3){
score +=4;
}else{score +=2;}
}
if (genre === 'homme' && etatCivil==='Divorcé(e)') {
if(nbEnfants==0){
score +=10;
}else if(nbEnfants==1){
score +=7;
}else if(nbEnfants==2){
score +=5;
}else if(nbEnfants==3){
score +=3;
}else{score +=1;}
}
if (genre === 'homme' && etatCivil==='Marié(e)'&& nbEnfants==0 ) {
if (salaireNet !== null) {
if (700>salaireNet && salaireNet< 1000) {
score += 3;
}else if(1000>salaireNet && salaireNet<1500){
score +=6;
}else if(1500>salaireNet && salaireNet<2000){
score +=8;
}else if(2000>salaireNet && salaireNet<3000){
score+=15;
}else if(salaireNet>3000){
score +=10;
}}else{score +=2;}
}
if (genre === 'homme' && etatCivil==='Marié(e)'&& nbEnfants>0 ) {
if (salaireNet !== null) {
if (700>salaireNet && salaireNet< 1000) {
score += 2;
}else if(1000>salaireNet && salaireNet<1500){
score +=4;
}else if(1500>salaireNet && salaireNet<2000){
score +=7;
}else if(2000>salaireNet && salaireNet<3000){
score+=10;
}else if(salaireNet>3000){
score +=12;
}}else{score+=1;}
}
if (700>salNet && salNet< 1000) {
score += 3;
}else if(1000>salNet && salNet<1500){
score +=6;
}else if(1500>salNet && salNet<2000){
score +=10;
}else if(2000>salNet && salNet<3000){
score+=15;
}else if(salNet>3000){
score +=20;
}
if(typeHeber==='Locataire'){
score+=5;
}else
{score+=15;}
if(profession==='Agriculture et agroalimentaire'){
score+=3;
}else if(profession==='Industrie'){
score+=5;
}else if(profession==='Commerce'){
score+=8;
}else if(profession==='Tourisme'){
score+=6;
}else if(profession==='Télécoms et Internet'){
score+=13;
}else if(profession==='Finance'){
score+=10;
}
const { years, months } = this.extractDuration(dureeRem);
if (years === 0 && months<8) {
score += 10;
} else if (years ===0 && months > 8) {
score += 8;
}else if(years===1 && months===0){
score+=7;
}else if(years>1 && months===0){
score +=5;
}
if(periodicite==='Mensuelle'){
score +=5;
}else if
(periodicite==='trimestriel'){
score +=10;
}
else if(periodicite==='semestriel'){
score +=7;
}
if(montant>500 && montant<1500){
score+=15;
}else if(montant>1500 && montant<2500){
score+=10;
}else if(montant>2500 && montant<3500){
score+=8;
}else if(montant>3500 && montant<5000){
score+=6;
}else if(montant>5000){
score+=4;
}
const age = this.calculateAge(dateNai);
if (age < 30) {
score += 5;
}else if(25<age && age<30){
score +=10
}else if(30<age && age<35){
score +=13;}
else if(35<age && age<45){
score +=15;
}else if( age>45){
score +=9;
}
const scorePercentage = this.calculateScorePercentage(score);
return scorePercentage;
}
calculateAge(dateNai: Date): number {
// Convertir la date de naissance en objet Date
const birthDate = new Date(dateNai);
// Obtenir la date actuelle
const currentDate = new Date();
// Calculer la différence en millisecondes entre la date actuelle et la date de naissance
const diffMilliseconds = currentDate.getTime() - birthDate.getTime();
// Convertir la différence en années en utilisant le nombre de millisecondes dans une année
const millisecondsPerYear = 1000 * 60 * 60 * 24 * 365.25;
const age = Math.floor(diffMilliseconds / millisecondsPerYear);
return age;
}
extractDuration(duration: string): { years: number, months: number } {
const regex = /(\d+)\s*(ans|mois)/i;
const match = duration.match(regex);
if (match) {
const value = parseInt(match[1], 10);
const unit = match[2].toLowerCase();
if (unit === 'ans') {
return { years: value, months: value * 12 };
} else if (unit === 'mois') {
return { years: Math.floor(value / 12), months: value };
}
}
return { years: 0, months: 0 };
}
calculateScorePercentage(score: number): number {
// Calcul du pourcentage en utilisant la formule : (score obtenu / score total) * 100
const percentage = (score / 11) * 100;
// Arrondir le pourcentage à deux décimales
const roundedPercentage = Math.round(percentage * 100) / 100;
return roundedPercentage;
}
retour(){
this.router.navigate(['']);
}
}
'''
1条答案
按热度按时间ha5z0ras1#
您可以创建Object Of Demande,如果它是一个类,如
它可以解决你的错误