o
    {Ih                     @   s  d Z ddlZddlmZmZmZ ddlZ			dfddZdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Z			dfddZ			dgddZ			dhdd Z				did!d"Z		djd#d$Z			dhd%d&Z			dkd'd(Z			dkd)d*Z			dkd+d,Z			dld-d.Z		/	0			dmd1d2Z					dnd3d4Z			5dod6d7Z	8				dpd9d:Z 							dqd;d<Z!drd=d>Z"drd?d@Z#dAdBdCdCdDdEdFdBdFdGdCdCdHdIdAdBdCdCdJdEdFdBdFdGdHdHdCdKdJdLdAdMdLdFdNdAdBdCdCdJdEdFdBdFdGdHdHdCdKdOdLdPdCdQdLdGdCdFdPdGdRdAdPdCdAdAdQdPdPdCdHdPdSdTdPdCdAdUdQdPdPdCdHdPdSdVdLdGdJdLdGdLdPdCdW	dXZ$dYdZ Z%d[d\ Z&d]ee'ef d^ee'e(f fd_d`Z)d]ee'ef d^ee'ef fdadbZ*dsd]ee'ef d^e'fdcddZ+d]ee'ef d^ee'ef fdeddZ+dS )tu9   
상태평가표 생성을 위한 유틸리티 함수들
    N)ListDictAnyFc                 C   st  d}d}| dur-d}| dkrdS | dkrt |d}n| d	kr$t |d
}n	| dkr-t |d}|durVd}|dkr9dS |dkrCt |d}n|dkrMt |d
}n	|dkrVt |d}|durod}|dkrft |d
}n	|dkrot |d}|durd}|dkrt |d}n|dkrt |d
}n	|dkrt |d}|durd}|dkrt |d}n	|dkrt |d
}|rd}t |d}|sd}|S )uW   
    일반 콘크리트 바닥판 상태평가 등급(a~e)을 반환하는 함수
    aFNT      ?e      ?d333333?c皙?b   
      r   maxcrack_widthcrack_ratio
leak_ratiosurface_damage_ratiorebar_corrosion_ratioother_damagegradehas_any_damage r   ?/home/skpark/git/infrasmart_work/infrasmart/utils/evaluation.pyevaluate_slab_condition   s`   





r   c                    s   d}t | }|rt|dnd}d}t | }|r$t|dnd}d}t | }|r7t|dnd}	d}
t |
 }|rJt|dnd}d}t | }|rad vrat|dS t fd	d
dD }t|||	|t|dS )us   
    손상 내용에 따라 콘크리트 바닥판의 상태평가 등급을 자동으로 결정하는 함수
    u   균열\((\d+(?:\.\d+)?)mm\)   Nu   균열률\s*(\d+(?:\.\d+)?)%u$   (?:누수|백태)\s*(\d+(?:\.\d+)?)%u   표면손상\s*(\d+(?:\.\d+)?)%u   철근부식\s*(\d+(?:\.\d+)?)%u   잡철근노출c                 3       | ]}| v V  qd S Nr   .0xdamage_descr   r   	<genexpr>m       z'evaluate_slab_damage.<locals>.<genexpr>)u   박리u   들뜸   파손u   침식u   세굴)r   r   r   r   r   r   )researchfloatgroupanyr   r   )r&   crack_patterncrack_matchr   crack_ratio_patterncrack_ratio_matchr   leak_pattern
leak_matchr   surface_patternsurface_matchr   rebar_patternrebar_matchr   r   r%   r   evaluate_slab_damageN   s2   r9   c              	   C   s@   | dt  dddddddddddddddd	d	dd
dS )u/   
    기본 평가 데이터 구조 생성
    PFr   r   )	   바닥판   거더	   가로보   포장   배수)   난간연석   신축이음   교량받침Q)   하부   기초u   상부rD   -)	   탄산화	   염화물)u   번호   구조형식   상부구조
   2차부재   하부구조   내구성요소)r   )namer   r   r   get_default_evaluation_datay   s&   rP   c                 C   s   ddddddddddddddd	dd
ddddddddddddddd	dd
ddddddddddddddddd
d}| | |d S )u1   
    구조형식별 부재 가중치 반환
                	      r   rF   r   )r;   r<   rL      교대/교각rE   rB   rA      교면포장   배수시설   난간/연석rH   rI      r   %               )   일반거더교u   2차부재없음   바닥판거더일체형ra   get)structure_typeweightsr   r   r   get_weights_by_structure_type   sR   -rg   c                 C   s  |  dd}t|}d}d}| d  D ]\}}||v r,|t|||  7 }||| 7 }qd}d}| d  D ]\}}||v rO|t|||  7 }||| 7 }q7d}	d}
| d  D ]\}}||v rr|	t|||  7 }	|
|| 7 }
qZd}d}| d  D ]+\}}||v r| D ]\}}||| v r|t||| |  7 }||| | 7 }qq}|| |
 | }|dkrdS || |	 | | }|S )	u   
    평가 결과로부터 결함도 점수를 계산하는 함수
    
    Args:
        eval_result (dict): 평가 결과 데이터
        
    Returns:
        float: 결함도 점수
    rJ   ra   r   rK   rL   rM   rN           )rd   rg   itemsgrade_to_defect_score)eval_resultre   rf   superstructure_scoresuperstructure_weight	componentr   secondary_scoresecondary_weightsubstructure_scoresubstructure_weightdurability_scoredurability_weightgradesparttotal_weightfinal_scorer   r   r   calculate_defect_score   sJ   
ry   c                 C   s4   | dkrdS | dkrdS | dkrdS | dkrdS d	S )
u   
    결함도 점수에 따른 상태등급을 반환하는 함수
    
    Args:
        defect_score (float): 결함도 점수
        
    Returns:
        str: 상태등급 (A~E)
    皙?Ag?Bg333333?Cg?DEr   )defect_scorer   r   r   get_condition_grade  s   
r   c                 C   sH   |   } | dkr
dS | dkrdS | dkrdS | dkrdS | d	kr"d
S dS )u   
    상태등급을 결함도 점수로 변환하는 함수
    
    Args:
        grade (str): 상태등급 (a~e)
        
    Returns:
        float: 결함도 점수
    r   rh   r   r
   r   r   r	   gffffff?r   r   )lower)r   r   r   r   rj     s   
rj   c                    s   d v rt d }|rt|d}t|d| d d< d v r.d v s(d v r.d	| d d< d
 v s6d v r<d| d d
< d v rFd| d d< d v rPd| d d< d v rZd| d d< t fdddD rmd| d d< dS dS )u?   
    손상 내용에 따라 평가 데이터 업데이트
    u   균열z(\d+(\.\d+)?)mmr   )r   rK   r;   r>   r)   r   r?   u   누수r   u   난간rL   r@   rA   u   받침rB   c                 3   r    r!   r   r"   r%   r   r   r'   R  r(   z)update_evaluation_data.<locals>.<genexpr>)   교각   교대u   기둥rM   rD   N)r*   r+   r,   r-   r   r.   )row_datar&   matchr   r   r%   r   update_evaluation_data1  s&   r   c                 C   s   | sdS g }d}t t||  dD ])\}\}}t|}t|}||||d |d| d| d|dd| d	7 }q|d	7 }|rTt|\}	}
|d
|	dd|
 d7 }|S )u   
    평가 결과를 HTML 테이블 형식으로 생성
    
    Args:
        evaluation_data (dict): 평가 결과 데이터
        spans (list): 교량 연장 리스트
        
    Returns:
        str: HTML 형식의 평가 결과 테이블
    u(   <p>평가 데이터가 없습니다.</p>u  
    <style>
        table { border-collapse: collapse; width: 100%; }
        th, td { border: 1px solid black; padding: 8px; text-align: center; }
        th { background-color: #f2f2f2; }
        .final-evaluation { margin-top: 20px; font-weight: bold; }
    </style>
    <table>
        <tr>
            <th>교량 번호</th>
            <th>연장(m)</th>
            <th>환산 결함도 점수</th>
            <th>상태등급</th>
        </tr>
    r   )   연장   환산 결함도 점수u   상태등급z
        <tr>
            <td>z</td>
            <td>z.2fz</td>
        </tr>
        z</table>u   
        <div class="final-evaluation">
            <p>최종 평가 결과:</p>
            <p>연장비를 고려한 최종 환산 결함도 점수: u)   </p>
            <p>최종 상태등급: z</p>
        </div>
        )	enumeratezipvaluesry   r   appendgenerate_final_evaluation)evaluation_dataspansbridges_datahtml
bridge_numspanrk   r   condition_graderx   final_grader   r   r   generate_evaluation_htmlU  s<    	
r   c                 C   s   i }i }|  dD ]=\}}t|}d| v rd|d< n
d| v r&d|d< | D ]\}}t||d  d|v rAt|d ||< q*|||< q	t||S )	u.   
    상태평가표 생성 메인 함수
    u	   부재명u   라멘rb   rJ   r<   ra   u   손상내용r   )groupbyrP   r   iterrowsr   r,   r   )dfr   r   rO   r-   r   _damager   r   r   generate_evaluation_table  s   


r   c                    s8   t dd | D  t  fdd| D }t|}||fS )u   
    연장비를 고려한 최종 평가 결과 계산
    
    Args:
        bridges_data (list): 각 교량의 연장, 결함도 점수, 상태등급 정보를 담은 딕셔너리 리스트
        
    Returns:
        tuple: (최종 환산 결함도 점수, 최종 상태등급)
    c                 s       | ]}|d  V  qdS )r   Nr   r#   bridger   r   r   r'     r(   z,generate_final_evaluation.<locals>.<genexpr>c                 3   s$    | ]}|d  |d    V  qdS )r   r   Nr   r   total_lengthr   r   r'     s   " )sumr   )r   weighted_scorer   r   r   r   r     s   
r   c                 C   sd  d}d}| dur)d}| dkrdS | dkrt |d}n| d	kr$t |d
}nt |d}|durNd}|dkr5dS |dkr?t |d}n|dkrIt |d
}nt |d}|durgd}|dkr^t |d
}n	|dkrgt |d}|durd}|dkrwt |d}n|dkrt |d
}n	|dkrt |d}|durd}|dkrt |d}n	|dkrt |d
}|rd}t |d}|sd}|S )uc   
    프리스트레스 콘크리트 바닥판 상태평가 등급(a~e)을 반환하는 함수
    r   FNTr   r   r
   r	   rz   r   r   r   r   r   r   r   r   r   r   r   evaluate_psc_slab_condition  s\   





r   c                 C   s   d}d}| dur-d}| dkrdS | dkrt |d}n| d	kr$t |d
}n	| dkr-t |d}|durPd}|dkr=t |d}n|dkrGt |d
}n	|dkrPt |d}|durid}|dkr`t |d}n	|dkrit |d
}|rod}dS |rxd}t |d}|s|d}|S )uS   
    철근콘크리트 거더 상태평가 등급(a~e)을 반환하는 함수
    r   FNTr   r   r   r	   r
   r   r   r   r   r   r   r   )r   r   r   structural_issuer   r   r   r   r   r   evaluate_rc_girder_condition
  sF   



r   c                 C   sF  d}d}| dur)d}| dkrdS | dkrt |d}n| d	kr$t |d
}nt |d}|durLd}|dkr9t |d}n|dkrCt |d
}n	|dkrLt |d}|dured}|dkr\t |d}n	|dkret |d
}|durd}|dkrqdS |dkr{t |d}n|dkrt |d
}n	|dkrt |d}|rd}dS |rd}t |d}|sd}|S )uc   
    프리스트레스트 콘크리트 거더 상태평가 등급(a~e)을 반환하는 함수
    r   FNTr   r   r
   r	   rz   r   r   r   r   r   brokensection_losssurfacenoner   )r   r   r   tendon_corrosion_levelr   r   r   r   r   r   r   evaluate_psc_girder_conditionA  sX   




r   c           	      C   s$  d}d}| dur#d}| dkrdS | dkrt |d}n	| d	kr#t |d
}|durFd}|dkr3t |d}n|dkr=t |d
}n	|d	krFt |d}|dur[d}|dkrRdS |dkr[t |d}|durtd}|dkrkt |d}n	|dkrtt |d
}|r}d}t |d}|rd}dS |rd}t |d}|sd}|S )u]   
    강 바닥판 / 강 거더 / 강 교각(강 주탑) 상태평가 등급(a~e) 반환
    r   FNTr   r   r   r	   r   r   r   severeminorr   )	main_rust_areasub_rust_areasection_loss_areaweld_defect_levelbolt_damager   r   r   r   r   r   r   evaluate_steel_component  sT   





r   c                 C   s   d}d}| dur'd}| dkrt |d}n| dkrt |d}n	| d	kr't |d
}|durJd}|dkr7t |d}n|dkrAt |d}n	|dkrJt |d
}|durcd}|dkrZt |d}n	|dkrct |d}|rld}t |d
}|spd}|S )uP   
    콘크리트 가로보 상태평가 등급(a~d)을 반환하는 함수
    r   FNTr   r	   r
   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   evaluate_concrete_crossbeam  s<   



r   c                 C   s  d}d}| durd}| dkrt |d}n	| dkrt |d}|dur@d}|d	kr-t |d}n|dkr7t |d}n	|dkr@t |d
}|durYd}|dkrPt |d}n	|dkrYt |d}|durrd}|dkrit |d}n	|dkrrt |d}|r{d}t |d}|rd}t |d
}|sd}|S )uR   
    강 가로보·세로보 상태평가 등급(a~d)을 반환하는 함수
    r   FNTr   r	   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   evaluate_steel_crossbeam  sJ   





r   c                 C   s  d}d}|dur#d}|dkrdS |dkrt |d}n	|d	kr#t |d
}| durBd}| dkr3t |d}n| dkr=t |d
}nt |d}|dured}|dkrRt |d}n|dkr\t |d
}n	|d	kret |d}|rnd}t |d}|rrdS |r{d}t |d}|sd}|S )uJ   
    케이블 부재 상태평가 등급(a~e)을 반환하는 함수
    r   FNTr   r   r   r	   r   r   r   r   r   )corrosion_length_ratiowire_break_ratiosheath_damage_ratioanchorage_damagestructural_failurer   r   r   r   r   r   evaluate_cable_component/  sH   




r   c                 C   s
  d}d}| dur-d}| dkrdS | dkrt |d}n| d	kr$t |d
}n	| dkr-t |d}|durPd}|dkr=t |d}n|dkrGt |d
}n	|dkrPt |d}|durid}|dkr`t |d}n	|dkrit |d
}|rrd}t |d}|rvdS |rd}t |d}|sd}|S )u@   
    교대 상태평가 등급(a~e)을 반환하는 함수
    r   FNTr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   severe_structural_riskr   r   r   r   r   r   evaluate_abutment_conditioni  sJ   




r   c                 C   s
  d}d}| dur-d}| dkrdS | dkrt |d}n| d	kr$t |d
}n	| dkr-t |d}|durPd}|dkr=t |d}n|dkrGt |d
}n	|dkrPt |d}|durid}|dkr`t |d}n	|dkrit |d
}|rmdS |rvd}t |d}|rd}t |d}|sd}|S )uM   
    콘크리트 교각 상태평가 등급(a~e)을 반환하는 함수
    r   FNTr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   evaluate_pier_condition  sJ   




r   c                 C   s   d}d}| durd}| dkrt |d}n	| dkrt |d}|r&d}t |d}|r/d}t |d	}|r8d}t |d	}|r<d
S |rEd}t |d}|sId}|S )u@   
    기초 상태평가 등급(a~e)을 반환하는 함수
    r   FNTr
   r   r   r   r	   r   r   )r   r   rebar_exposedsettlement_or_scoursevere_riskr   r   r   r   r   r   evaluate_foundation_condition  s2   




r      정상   없음c           	      C   s   d}d}|rdS |dkrdS |dkrd}t |d}|dkr%d}t |d}n|d	kr0d}t |d
}| rAd}|r<t |d}nt |d
}|durjd}|dkrMdS |dkrWt |d}n|dkrat |d
}n	|dkrjt |d}|rsd}t |d}|swd}|S )uF   
    교량받침 상태평가 등급(a~e)을 반환하는 함수
    r   Fr   u
   1/2 이상u   일부Tr	   u   1.5T 이상u   0.7T 이상r   Nr   r   r
   r   r   r   )	rubber_splitrubber_bulgingshear_deformationcorrosion_arear   r   r   r   r   r   r   r   evaluate_bearing_condition  sH   	




r   c                 C   sH   d}|rdS |rt |d}|rt |d}| rt |d}|r"t |d}|S )uF   
    신축이음 상태평가 등급(a~d)을 반환하는 함수
    r   r	   r   r   r   )aging_or_dirtfunction_degradationimpact_or_noisestructural_damager   r   r   r   r   evaluate_expansion_joint=  s   



r      아스팔트c                 C   s   d}|dvr
t d| dur?|dkr'| dkrd}n&| dkr d	}n| d
kr&d}n|dkr?| dkr2d}n| dkr9d	}n| d
kr?d}|rFt|d}|S )uF   
    교면포장 상태평가 등급(a~d)을 반환하는 함수
    r   )r      콘크리트u=   pavement_type must be either '아스팔트' or '콘크리트'Nr   r   r	   rR   r   r   r   r      )
ValueErrorr   )damage_ratiopuddle_presentpavement_typer   r   r   r   evaluate_pavement_conditionX  s,   
r   r   c                 C   s4   |rdS |s
|s
|rdS | dkrdS | dkrdS dS )uF   
    배수시설 상태평가 등급(a~d)을 반환하는 함수
    r	   r   manysomer   r   r   )deposit_amountleakagecorrosion_due_to_leakageoutlet_riskdamaged_or_agedr   r   r   evaluate_drainage_facilityx  s   r   c                 C   s   d}|rdS |dks|dks|dkrdS |dks |dks |dkr%t |d}|dur<|dkr3t |d}n	|dkr<t |d	}| dkrFt |d}n	| dkrOt |d	}|rVt |d	}|S )
uK   
    난간 및 연석 상태평가 등급(a~d)을 반환하는 함수
    r   r	   r   r   r   r   Nr
   r   r   )paint_damage_ratiolocal_loosenessr   section_loss_ratiospalling_or_exposed_rebar_ratiorebar_corrosion_length_ratiooverturning_riskr   r   r   r   evaluate_railing_or_curb  s&   




r   c                 C   s<   | du rdS | dk r|rdS dS | dk rdS | dk rd	S dS )
uC   
    탄산화 상태평가 등급(a~e)을 반환하는 함수
    Nr   r   r   r	   r   r   r   r   r   )remaining_depthrebar_corrosion_confirmedr   r   r   evaluate_carbonation     r   c                 C   s<   | du rdS | dkr|rdS dS | dkrdS | dkrd	S dS )
uC   
    염화물 상태평가 등급(a~e)을 반환하는 함수
    Nr   g      @r   r	   g333333?r   r
   r   r   )total_chlorider   r   r   r   evaluate_chloride  r   r   r   rU   r      rS   rT   rV   r   )r;   rB   rZ      염화물_상부r<   rW   rE   rA   rX   rY      탄산화_상부   탄산화_하부   염화물_하부r[   )r;   rB   rZ   r   u	   강거더rW   rE   rA   rX   rY   r   r   r   r      )r;   rA   r   rX   rE   rZ      rR      )u	   슬래브rA   rZ   r   rW   rX   r   r   rE   rY   r   )u   상판rA   r   u   주탑u	   케이블u	   보강형rX   rZ   r   r   rE      rQ   r   )	rK   rA   r   u   활하중지지부rX   r   rE   rZ   r   )u   PSC 박스거더교u   강상형교u	   라멘교u   강박스거더교u   RC슬래브교u	   현수교u	   사장교u	   아치교c                 C   sX   d}d}|  D ]\}}| |d}t|}||| 7 }||7 }q|r*t|| dS dS )Nr   r   rV   rh   )ri   rd   rj   round)component_gradesweight_tablerw   weighted_sumrn   weightr   scorer   r   r   calculate_structure_defect>  s   
r   c              
   C   s   g ddd}t dd | D }d}| D ]D}|d }|d }|d	 }t|}|s/td
| t||}	|r:|| nd}
||	|
 7 }|d ||t|	dt|	t|
dd qt|d|d< t||d< dd l}dd l	}|
|d }|jd|d |S )Nrh   r{   )structure_scorestotal_defect_scoretotal_gradec                 s   r   )lengthNr   )r#   itemr   r   r   r'   O  r(   z2evaluate_bridge_total_condition.<locals>.<genexpr>r   rO   r  r   u"   지원하지 않는 구조형식: r   rV   )rO   r  r   r   length_ratior   r  u&   구조형식별 환산결함도 결과)rO   	dataframe)r   STRUCTURE_WEIGHTSrd   r   r   r   r   r   pandas	ace_tools	DataFramedisplay_dataframe_to_user)structure_dataresultr   weighted_score_sumr  rO   r  ru   r   r   r  pdtoolsr   r   r   r   evaluate_bridge_total_conditionI  s<   


r  bridge_datareturnc                 C   sN   | d }| d }| d }|| }|| || |d || || |d d}|S )u_  
    교량의 기본 정보를 바탕으로 자동 계산되는 면적들을 계산합니다.
    
    Args:
        bridge_data (Dict[str, Any]): 교량 기본 정보
            - length: 연장 (m)
            - width: 폭 (m)
            - span_count: 경간 수
            
    Returns:
        Dict[str, float]: 자동 계산된 면적들
    r  width
span_countr   )slabpavementrailing	span_slabspan_pavementspan_railingr   )r  r  r  r  span_lengthareasr   r   r   calculate_automatic_areasq  s   r  c                 C   s   g d}|D ]}|| vrt d| qt| d ttfr#| d dkr't dt| d ttfr6| d dkr:t dt| d trG| d dkrKt d	t| }d
| vrWi | d
< | d
 | | S )u  
    교량 입력 데이터의 유효성을 검사하고 필요한 계산을 수행합니다.
    
    Args:
        bridge_data (Dict[str, Any]): 교량 입력 데이터
            - name: 교량명
            - length: 연장 (m)
            - width: 폭 (m)
            - structure_type: 구조형식
            - span_count: 경간 수
            - expansion_joint_locations: 신축이음 위치 리스트
            - component_areas: 부재별 면적
                - girder: 거더 면적
                - crossbeam: 가로보 면적
                - abutment: 교대 면적
                - pier: 교각 면적
                
    Returns:
        Dict[str, Any]: 검증 및 계산이 완료된 교량 데이터
    )rO   r  r  re   r  u+   필수 입력값이 누락되었습니다: r  r   u-   연장은 0보다 큰 숫자여야 합니다.r  u*   폭은 0보다 큰 숫자여야 합니다.r  u1   경간 수는 0보다 큰 정수여야 합니다.component_areas)r   
isinstanceintr,   r  update)r  required_fieldsfield
auto_areasr   r   r   validate_bridge_input  s    r%  c                 C   s   d}| rO|d|  dd d|  dd d|  dd d	|  d
d d|  dd d|  dd d|  dd d|  dd d|  dd d|  dd d7 }|S )u   상태평가 입력 폼의 HTML을 생성합니다.
    
    Args:
        bridge_data: 교량 데이터 (선택적)
        
    Returns:
        str: 생성된 HTML 폼
    u  
    <div class="evaluation-form">
        <h3>교량 상태평가</h3>
        <form id="bridgeEvaluationForm">
            <div class="form-grid">
                <div class="form-section">
                    <h4>교량 기본 정보</h4>
                    <div class="form-group">
                        <label for="bridgeName">교량명</label>
                        <input type="text" id="bridgeName" name="bridgeName" required>
                    </div>
                    <div class="form-group">
                        <label for="length">연장(m)</label>
                        <input type="number" id="length" name="length" step="0.01" required>
                    </div>
                    <div class="form-group">
                        <label for="width">폭(m)</label>
                        <input type="number" id="width" name="width" step="0.01" required>
                    </div>
                    <div class="form-group">
                        <label for="structureType">구조형식</label>
                        <select id="structureType" name="structureType" required>
                            <option value="PSCI">PSCI</option>
                            <option value="STB">STB</option>
                            <option value="RCS">RCS</option>
                            <option value="RA">RA</option>
                            <option value="PSC BOX">PSC BOX</option>
                        </select>
                    </div>
                    <div class="form-group">
                        <label for="spanCount">경간 수</label>
                        <input type="number" id="spanCount" name="spanCount" min="1" required>
                    </div>
                    <div class="form-group">
                        <label for="expansionJoint">신축이음 위치</label>
                        <input type="text" id="expansionJoint" name="expansionJoint" placeholder="예: A1, P1, P2" required>
                    </div>
                </div>
                <div class="form-section">
                    <h4>부재별 면적(m²)</h4>
                    <div class="form-group">
                        <label for="girderArea">거더 면적</label>
                        <input type="number" id="girderArea" name="girderArea" step="0.01" required>
                    </div>
                    <div class="form-group">
                        <label for="crossbeamArea">가로보 면적</label>
                        <input type="number" id="crossbeamArea" name="crossbeamArea" step="0.01" required>
                    </div>
                    <div class="form-group">
                        <label for="abutmentArea">교대 면적</label>
                        <input type="number" id="abutmentArea" name="abutmentArea" step="0.01" required>
                    </div>
                    <div class="form-group">
                        <label for="pierArea">교각 면적</label>
                        <input type="number" id="pierArea" name="pierArea" step="0.01" required>
                    </div>
                </div>
            </div>
            <div class="form-buttons">
                <button type="button" id="evaluateBridge" class="btn btn-primary">평가하기</button>
                <button type="button" id="saveData" class="btn btn-secondary">저장</button>
            </div>
        </form>
        <div id="evaluationResult" class="mt-4">
            <!-- 평가 결과가 여기에 표시됩니다 -->
        </div>
    </div>
    z
        <script>
            document.addEventListener('DOMContentLoaded', function() {
                document.getElementById('bridgeName').value = '
bridgeName z>';
                document.getElementById('length').value = 'r  z=';
                document.getElementById('width').value = 'r  zE';
                document.getElementById('structureType').value = 'structureTypePSCIzA';
                document.getElementById('spanCount').value = '	spanCountzF';
                document.getElementById('expansionJoint').value = 'expansionJointzB';
                document.getElementById('girderArea').value = '
girderAreazE';
                document.getElementById('crossbeamArea').value = 'crossbeamAreazD';
                document.getElementById('abutmentArea').value = 'abutmentAreaz@';
                document.getElementById('pierArea').value = 'pierAreaz-';
            });
        </script>
        rc   )r  r   r   r   r   generate_bridge_evaluation_form  s0   	E






	




r0  c              
   C   s   t | }|d |d |d |d |d |dg d|d |d d	 |d d
 dg d|d dddg d|d dddg d|d d |d d dg dd|d dddg d|d dddg ddd|d d |d d dg didd}|S )u   
    교량 상태평가를 위한 입력 폼을 생성합니다.
    
    Args:
        bridge_data (Dict[str, Any]): 교량 기본 정보
        
    Returns:
        Dict[str, Any]: 상태평가 입력 폼
    rO   r  r  re   r  expansion_joint_locations)u	   교량명r   u   폭rJ   u	   경간수u   신축이음위치r  r  r  N)area	span_arear   damage_datagirderr   )r2  r   r4  	crossbeamr  r  )r;   r<   r=   r>   abutmentpier)r   r   u   연석r  r  )r  r  r   r4  )rK   rM   rL   )
basic_infor  r   )r%  rd   )r  validated_dataevaluation_formr   r   r   r0  $  s^   






:)NNNNNF)NNNFF)NNNNFF)NNNNFFF)NNNF)NNNFFF)NFFFFF)FFr   r   NFF)FFFFF)NFr   )r   FFFF)r   FNr   r   r   F)NFr!   ),__doc__r*   typingr   r   r   r  r  r   r9   rP   rg   ry   r   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  strr,   r  r%  r0  r   r   r   r   <module>   s   
F+4:$@
F
7
B
B
/
;
:
:
4
(
>

 


%
	k"("".&c