typescript 角Spring Boot评分算法存在的问题

oknwwptz  于 2023-05-23  发布在  TypeScript
关注(0)|答案(1)|浏览(93)

嗨,我做了一个计算得分得分算法,我在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(['']);
        }
    }

'''
ha5z0ras

ha5z0ras1#

您可以创建Object Of Demande,如果它是一个类,如

Demande demande=new Demande();

它可以解决你的错误

相关问题