o
     gh                  	   @   s  d Z ddlZddlZddlZddlmZmZmZm	Z	m
Z
 ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ deded	eeef fd
dZ d,dee ded	ee fddZ!d,dee ded	ee fddZ"d,dedee ded	efddZ#ded	efddZ$deeee f ded	efddZ%dej&d	eeee f fdd Z'dej&d	efd!d"Z(d#e)d	efd$d%Z*d#e)d	efd&d'Z+d#e)d	efd(d)Z,dej&ded	ee fd*d+Z-dS )-u]   
부재별 집계표 데이터를 기반으로 상태평가표를 자동 생성하는 모듈
    N)DictListAnyOptionalTuple)trim_dataframe_str_columns   )evaluate_slab_conditionevaluate_psc_slab_conditionevaluate_rc_girder_conditionevaluate_psc_girder_conditionevaluate_steel_componentevaluate_concrete_crossbeamevaluate_steel_crossbeamevaluate_abutment_conditionevaluate_pier_conditionevaluate_bearing_conditionevaluate_expansion_jointevaluate_pavement_conditionevaluate_drainage_facilityevaluate_railing_or_curbget_condition_gradegrade_to_defect_scoredamage_descdamage_quantityreturnc                    sL  ddddddd}g d}|D ]}t | }|r$t|d|d<  nqd v s-d v r2d|d< n3d	 v s:d
 v r?d|d< n&d v sGd v rLd|d< nd v sTd v rYd|d< nd v re|dkred|d< d v rq|d |d< |S d v syd v r||d< |S d v sd v sd v r||d< |S t fdddD rd vr||d< |S ) u   
    손상 내용에서 균열폭, 면적율 등의 값을 추출합니다.
    
    Args:
        damage_desc: 손상 내용 설명
        damage_quantity: 손상 물량
        
    Returns:
        Dict[str, float]: 추출된 손상 값들
    r   )crack_widthcrack_ratio
leak_ratiosurface_damage_ratiorebar_corrosion_ratio
area_ratio)u0   균열\s*\(\s*(\d+(?:\.\d+)?)\s*mm\s*이상\s*\)u'   균열\s*\(\s*(\d+(?:\.\d+)?)\s*mm\s*\)u(   균열\s*\(\s*(\d+(?:\.\d+)?)\s*㎜\s*\)u   (\d+(?:\.\d+)?)\s*mm\s*균열u   (\d+(?:\.\d+)?)\s*㎜\s*균열r   r   u   0.3mm미만u   0.3㎜미만皙?u   0.3mm이상u   0.3㎜이상333333?z0.2mmu   0.2㎜z0.1mmu   0.1㎜皙?u   망상균열   균열r      누수u   백태r      박리   박락   표면손상r   c                 3       | ]}| v V  qd S N .0keywordr   r,   F/home/skpark/git/infrasmart_work/infrasmart/utils/bridge_evaluation.py	<genexpr>R       z(extract_damage_values.<locals>.<genexpr>)u   철근노출   철근부식u   철근 노출u   철근 부식   부식u   녹u   잡철근노출r    )researchfloatgroupany)r   r   valuescrack_patternspatternmatchr,   r0   r1   extract_damage_values   sJ   




r?   RCcomponent_datacomponent_typec                 C   s  g }i }| D ]}|d }||vr"|| dddddddddd	||< t|d |d }|| }d|d v s;d	|d v rQt|d
 |d |d
< |d  |d 7  < nZd|d v scd|d v scd|d v r|d dkso|d dkr|d dkrzd|d< nt|d |d |d< |d  |d 7  < n|d dkrt|d
 |d |d
< |d  |d 7  < |d  |d 7  < |d  |d 7  < |d  |d 7  < q| D ]\}}t|d
 |d }t|d |d }	|d dkr|d dkrd|d< |dkr2t|dkr|nd|	dkr	|	nd|d dkr|d nd|d dkr!|d nd|d dkr-|d ndd}
n8t|dkr:|nd|	dkrB|	nd|d dkrN|d nd|d dkrZ|d nd|d dkrf|d ndd}
|
|d< || qt|dd dS )u(  
    바닥판 부재별 집계표 데이터를 상태평가표 형식으로 변환합니다.
    
    Args:
        component_data: 부재별 집계표 데이터
        component_type: 부재 타입 ('RC', 'PSC', 'STEEL')
        
    Returns:
        List[Dict]: 상태평가표 데이터
    spanIdinspectionAread   r   )	span_idareacrack_1d_widthcrack_1d_ratiocrack_2d_widthcrack_2d_ratior   r   r    
damageTypedamageQuantity   1방향u	   종방향rH   r   rI   r      2방향u	   횡방향u   망상r"   rJ   rK   r   r   r    NPSC)r   r   r   r   r    gradec                 S      | d S NrF   r,   xr,   r,   r1   <lambda>       z.process_slab_evaluation_data.<locals>.<lambda>key)getr?   maxitemsr
   r	   appendsorted)rA   rB   evaluation_data
spans_dataitemrF   damage_values	span_datamax_crack_widthmax_crack_ratiorQ   r,   r,   r1   process_slab_evaluation_dataW   sp   

$

rf   c           	      C   s.  g }i }| D ]y}|d }||vr"|| dddddddddd	||< t|d |d }|| }t|d	 |d	 |d	< |d
  |d
 7  < |d  |d 7  < d|d v rod|d v re|d  |d 7  < n
|d  |d 7  < d|d v r|d  |d 7  < q| D ]\}}|dkrt|d	 dkr|d	 nd|d
 dkr|d
 nd|d dkr|d nd|d d}nP|dkrt|d dkr|d nd|d dkr|d nd|d dkr|d ndd}n&t|d	 dkr|d	 nd|d
 dkr|d
 nd|d dkr|d ndd}||d< || qt|dd dS )u_   
    거더 부재별 집계표 데이터를 상태평가표 형식으로 변환합니다.
    rC   rD   rE   r   N)	rF   rG   r   r   r    tendon_corrosionmain_rust_areasub_rust_areasection_loss_arearL   rM   r   r   r    r5   u	   주부재rh   r!   ri   u   단면손실rj   rP   rg   )r   r   r    tendon_corrosion_levelSTEEL)rh   ri   rj   )r   r   r    rQ   c                 S   rR   rS   r,   rT   r,   r,   r1   rV      rW   z0process_girder_evaluation_data.<locals>.<lambda>rX   )	rZ   r?   r[   r\   r   r   r   r]   r^   )	rA   rB   r_   r`   ra   rF   rb   rc   rQ   r,   r,   r1   process_girder_evaluation_data   sb   

rm   component_namer_   c                    s	  ddddddddd	d
d
}| | | }d| d}| dkr-|d7 }|D ]  d du s3 d dkr5dn d d} d dkrCdn d d} d du sU d dkrWdnt d } d dkrednt d }	 d dkrsdn d d}
 d dkrdn d d} d dkrdn d d} d dkrdn d d} d dkrdn d d}|dg d d  d d  d!d| d"t d  d|
 d"t d  d| d"| d| d"|	 d| d"t d  d| d"t d  d| d"t d  d# d$  d%7 }q$n| d&krM|d7 }|D ]  d du sI d dkrKdn d d} d dkrZdn d d} d du sn d dkrpdnt d } d dkrdnt d }	 d dkrdn d d}
 d dkrdn d d} d dkrdn d d} d dkrdn d d} d dkrdn d d}|dg d d  d d  d!d| d"t d  d|
 d"t d  d| d"| d| d"|	 d| d"t d  d| d"t d  d| d"t d  d# d$  d%7 }q8n| d'kr|d(kr\|d)7 }n|d*7 }|d+7 }|D ]? |d d  d d  d!d d, dd"t d,  d- d dd"t d  d d dd"t d  d. d$  d%7 }qfn)| d/kr|d07 }|D ]L |d d  d  d1d d  d1ddkrd2nd d  d,d dt  d,d d  d3d d  d3ddkrd2nd d# d$  d%7 }qn| d4kr|d57 }|D ]~ |d d  d  d6d7 dd8 d9 v s+d: d9 v r-d;nd dtd8 d9 v p=d: d9 v  dd< d9 v sNd= d9 v rPd;nd dtd< d9 v p`d= d9 v  dt fd>d?d@D rqd;nd dtt fdAd?d@D  d# d$  d%7 }qnC| dBkr|dC7 }|D ]@   dD dE   d dF dF }|d d  d  d dFd!d|ddt| d dE ddt dE  d# d$  d%7 }qn| dGkr9|dH7 }|D ]Q |d d  d  d6d7 dd8 d9 v sdI d9 v rd;nd dtd8 d9 v pdI d9 v  ddJ d9 v r"d;nd dtdJ d9 v  d# d$  d%7 }qn| dKkr|dL7 }|D ] |dg d d  d dM d!d dN dd"t dN  d dO dd"t dO  d  dPddQd"t  dPd d d, dRd"t d,  d d dd"t d  d d dd"t d  d# d$  d%7 }qD|dS7 }|S )Tu<   
    부재별 상태평가표 HTML을 생성합니다.
    	   바닥판   거더	   가로보   교대   교각   교량받침   신축이음   교면포장   배수시설u   난간 및 연석)
slabgirder	crossbeamabutmentpierbearingexpansionJointpavementdrainagerailingzX
    <div class="evaluation-table-container mb-4">
        <h4 class="text-center mb-3">u    상태평가표</h4>
        <div class="table-responsive">
            <table class="table table-bordered table-striped">
    rx   u  
                <thead class="table-dark">
                    <tr>
                        <th rowspan="2">구 분</th>
                        <th rowspan="2">점검<br>면적<br>(m²)</th>
                        <th colspan="4">1방향 균열</th>
                        <th colspan="4">2방향 균열</th>
                        <th colspan="6">열화 및 손상</th>
                        <th rowspan="2">상태<br>평가<br>결과</th>
                    </tr>
                    <tr>
                        <th colspan="2">최대폭(mm)</th><th colspan="2">균열율(%)</th>
                        <th colspan="2">최대폭(mm)</th><th colspan="2">균열율(%)</th>
                        <th colspan="2">누수 및 백태<br>면적율(%)</th>
                        <th colspan="2">표면손상<br>면적율(%)</th>
                        <th colspan="2">철근부식<br>손상면적율(%)</th>
                    </tr>
                </thead>
                <tbody>
        rJ   Nr   -z.2frK   arI   rH   r   r   r     z6
                    <tr>
                        <td>rF   "</td>
                        <td>rG   z.1fz	</td><td>z></td>
                        <td class="fw-bold text-center">rQ   z,</td>
                    </tr>
            rz   ry   rl   uG  
                <thead class="table-dark">
                    <tr>
                        <th rowspan="2">구 분</th>
                        <th rowspan="2">점검<br>면적<br>(m²)</th>
                        <th colspan="8">모재 및 연결부 손상</th>
                        <th colspan="2">표면열화<br>면적율(%)</th>
                        <th rowspan="2">상태<br>평가<br>결과</th>
                    </tr>
                    <tr>
                        <th colspan="2">부재 균열</th>
                        <th colspan="2">변형, 파단</th>
                        <th colspan="2">연결 볼트<br>이완, 탈락</th>
                        <th colspan="2">용접연결부<br>결함</th>
                        <th colspan="2"></th>
                    </tr>
                </thead>
            u  
                <thead class="table-dark">
                    <tr>
                        <th rowspan="2">구 분</th>
                        <th rowspan="2">점검<br>면적<br>(m²)</th>
                        <th colspan="4">1방향 균열</th>
                        <th colspan="4">2방향 균열</th>
                        <th colspan="6">열화 및 손상</th>
                        <th rowspan="2">상태<br>평가<br>결과</th>
                    </tr>
                    <tr>
                        <th colspan="2">최대폭(mm)</th><th colspan="2">균열율(%)</th>
                        <th colspan="2">최대폭(mm)</th><th colspan="2">균열율(%)</th>
                        <th colspan="2">누수 및 백태<br>면적율(%)</th>
                        <th colspan="2">표면손상<br>면적율(%)</th>
                        <th colspan="2">철근부식<br>손상면적율(%)</th>
                    </tr>
                </thead>
            z<tbody>r   z</td>
                        <td>-</td><td>a</td>
                        <td>-</td><td>a</td>
                        <td>-</td><td>a</td>
                        <td>zk</td>
                        <td>-</td><td>a</td>
                        <td class="fw-bold text-center">r}   u  
                <thead class="table-dark">
                    <tr>
                        <th rowspan="2">구 분</th>
                        <th colspan="2">받침본체(탄성받침, 강재받침)</th>
                        <th colspan="4">받침 콘크리트 등</th>
                        <th rowspan="2">상태<br>평가<br>결과</th>
                    </tr>
                    <tr>
                        <th>손상현황</th>
                        <th>등급</th>
                        <th>균열 최대폭(mm)</th>
                        <th>등급</th>
                        <th>단면손상</th>
                        <th>등급</th>
                    </tr>
                </thead>
                <tbody>
        body_conditionbsection_damager~   u  
                <thead class="table-dark">
                    <tr>
                        <th rowspan="2">구 분</th>
                        <th rowspan="2">개소<br>(개)</th>
                        <th colspan="6">신축이음의 기능 및 상태</th>
                        <th rowspan="2">상태<br>평가<br>결과</th>
                    </tr>
                    <tr>
                        <th colspan="2">구조적 손상</th>
                        <th colspan="2">기능 저하</th>
                        <th colspan="2">기타</th>
                    </tr>
                </thead>
                <tbody>
        countr      파손	conditionr%   u   ○   탈락   변위c                 3       | ]	}| d  v V  qdS r   Nr,   r.   worddatar,   r1   r2         z6generate_component_evaluation_table.<locals>.<genexpr>)   이완u   변형u   기타c                 3   r   r   r,   r   r   r,   r1   r2     r   r   u>  
                <thead class="table-dark">
                    <tr>
                        <th rowspan="2">구 분</th>
                        <th rowspan="2">포장면적<br>(m²)</th>
                        <th colspan="4">포장손상</th>
                        <th rowspan="2">상태<br>평가<br>결과</th>
                    </tr>
                    <tr>
                        <th colspan="2">손상면적(m²)</th>
                        <th colspan="2">손상율(%)</th>
                    </tr>
                </thead>
                <tbody>
        damage_areadamage_ratiorE   r   u5  
                <thead class="table-dark">
                    <tr>
                        <th rowspan="2">구 분</th>
                        <th rowspan="2">개소<br>(개)</th>
                        <th colspan="4">배수시설 상태</th>
                        <th rowspan="2">상태<br>평가<br>결과</th>
                    </tr>
                    <tr>
                        <th colspan="2">파손/노화</th>
                        <th colspan="2">누수</th>
                    </tr>
                </thead>
                <tbody>
           노화r&   r   u  
                <thead class="table-dark">
                    <tr>
                        <th rowspan="2">구 분</th>
                        <th rowspan="2">길이<br>(m)</th>
                        <th colspan="6">강재</th>
                        <th colspan="6">콘크리트</th>
                        <th rowspan="2">상태<br>평가<br>결과</th>
                    </tr>
                    <tr>
                        <th colspan="2">도장손상(%)</th>
                        <th colspan="2">부식발생(%)</th>
                        <th colspan="2">연결재 및 단면손상(%)</th>
                        <th colspan="2">균열 최대폭(mm)</th>
                        <th colspan="2">표면손상 면적율(%)</th>
                        <th colspan="2">철근부식 손상면적율(%)</th>
                    </tr>
                </thead>
                <tbody>
        lengthpaint_damagecorrosion_ratioconnection_damage_ratioz:.2f if data.get("connection_damage_ratio", 0) > 0 else "-"z'.2f if data["crack_width"] > 0 else "-"zM
                </tbody>
            </table>
        </div>
    </div>
    )rZ   evaluate_gradejoinevaluate_expansion_grader:   evaluate_drainage_grade)rn   r_   rB   component_nameskorean_namehtmlcrack_2d_width_displaycrack_2d_ratio_displaycrack_2d_width_gradecrack_2d_ratio_gradecrack_1d_ratio_displaycrack_1d_width_displayleak_ratio_displaysurface_damage_displayrebar_corrosion_displayr   r,   r   r1   #generate_component_evaluation_table   s   

((



	
	



 
,,



	
	



 



	
	



	

""	

 



"











	

	
r   valuec                 C   s<   | dks| du r
dS | dk rdS | dk rdS | dk rd	S d
S )u/   손상 값에 따른 등급을 계산합니다.r   Nr   r$   r   r#   cg      ?der,   )r   r,   r,   r1   r   g  s   r   component_evaluationsstructure_typec                 C   s  i }|   D ]*\}}|r,dd |D }t|dd d}|||< t| d| d|  qd||< q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 ]\}}||v rt|| }t|}|	|| 7 }	|
|7 }
qZ|
dkr}|	|
 nd}t|}dg 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!d|ddd!d|ddd!d|ddd!d"|d!d#| d$}|S )%u;   
    통합 상태평가 결과표를 생성합니다.
    c                 S   s   g | ]}|d  qS )rQ   r,   )r.   r   r,   r,   r1   
<listcomp>~  s    z3generate_total_evaluation_table.<locals>.<listcomp>c                 S   s   t | S r+   )ordrT   r,   r,   r1   rV     rW   z1generate_total_evaluation_table.<locals>.<lambda>rX   u    부재 등급: u    -> 최종 r   r"   r$   g333333?g?)	rx   ry   rz   r   r   r   r~   r}   r{   g
ףp=
?gQ?)   PSC 박스거더교u
   PSC 빔교r   r   r   u  
    <div class="evaluation-summary mt-4">
        <h4 class="text-center mb-3">상태평가 통합 산정 결과표</h4>
        <div class="table-responsive">
            <table class="table table-bordered">
                <thead class="table-dark">
                    <tr>
                        <th>부재의 분류</th>
                        <th>구조형식</th>
                        <th>바닥판</th>
                        <th>거더</th>
                        <th>가로보</th>
                        <th>포장</th>
                        <th>배수</th>
                        <th>난간연석</th>
                        <th>신축이음</th>
                        <th>교량받침</th>
                        <th>하부</th>
                        <th>상태평가 결과</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>등급</td>
                        <td>r   rx   ry   rz   r   r   r   r~   r}   r{   z2</td>
                        <td class="fw-bold">u   </td>
                    </tr>
                    <tr>
                        <td>가중치</td>
                        <td>-</td>
                        <td>z.3fu   </td>
                        <td>-</td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div class="mt-3">
            <p><strong>환산 결함도 점수:</strong> ue   </p>
            <p><strong>최종 상태평가 결과:</strong> <span class="badge bg-primary fs-6">z*</span></p>
        </div>
    </div>
    )r\   r[   printrZ   r   r   r   )r   r   component_grades	componentevaluationsgradesworst_gradeweights
weight_settotal_scoretotal_weightrQ   weightscoredefect_scorefinal_grader   r,   r,   r1   generate_total_evaluation_tablet  s   









 
!"
'

(

)

*

+

,

-

.

/
6
7<r   dfc                 C   s`  t | } 	 dddddddddddd	d	d
d
d}i }| d  D ]}| | d |k }| D ]\}}t|d }d|v s?d|v rBd}nd }| D ]\}	}
|	|v rT|
} nqH|sXq-||vr`g ||< t|d |t|d rst|d ndt|d rt|d ndt|d rt|d ndt|	ddrt|	ddndd}|| 
| q-q|S )Nrx   ry   rz   r{   r|   r}   r~   r   r   r   )ro   rp   rq   rr   rs   rt      받침ru      이음장치rv      포장rw   	   배수구   난간   연석	   부재명   손상내용r   	   전단키   부재위치   손상물량r   u   개소   단위r   u   점검면적rE   )rC   rL   rM   r   unitrD   )r   uniqueiterrowsstrr\   pdnotnullr8   intrZ   r]   )r   component_mappingdamage_datarn   component_df_rowdamage_contentnormalized_componentrY   r   damage_itemr,   r,   r1   "process_damage_data_for_evaluation  sZ   
$r   c                    s6  t | }i }d}d|v rt|d }||d< |td|7 }d|v r2t|d }||d< |td|7 }d|v rGt|d }||d< |td|7 }d|v r\t|d }||d< |td|7 }d|v rqt|d }||d< |td|7 }d|v rg }	|d D ]%}
|
d |
d	 d
dtd|
d	 v pd|
d	 v d|
d	 v dd}|	| q{|	|d< |td|	7 }d|v rg }|d D ].}
|
d |
d	 |
ddtd|
d	 v pd|
d	 v d|
d	 v pd|
d	 v dd}|| q||d< |td|7 }d|v rFg }|d D ]?}
|
d }d|
d	 v r|
dd dkr|
d d }|
d d
kr(||
d  d nd
}|
d |t	|d d!}|| q||d< |td|7 }d"|v rg }t
 }|d" D ]}
d#|
d	 v rkd$|
d	 v rk||
d  qT|d" D ]@}
|
d	  |
d |v rt fd%d&d'D rd( |
d  |
ddtd v pd) v d* v pd( v d+d}|| qq||d"< |td"|7 }d,|v rg }|d, D ]>}
t|
d	 |
d }|
d |
dd|d- |d. |d/ d
d
|
d	 t|d- d
kr|d- nd0d1|
d	 v d2d3	}|| q||d,< |td,|7 }|t|d47 }|S )5u>   
    모든 부재의 상태평가표를 생성합니다.
    r   rx   ry   rz   r{   r|   r}   rC   rL   r   r   r%   u   분리r5   )rubber_splitcorrosion_area)rF   r   r   r   rQ   r~   r   r   r   r   r   )structural_damagefunction_degradation)rF   r   r   rQ   r   rM   r   m      ?rD   rE   )r   )rF   r   rQ   r   r      막힘c                 3   r*   r+   r,   r-   r   r,   r1   r2     r3   z5generate_all_component_evaluations.<locals>.<genexpr>)u   토사퇴적   퇴적u   적치u	   이물질   배수불량r   r&   )damaged_or_agedleakager   r   r   r    Nr   )r   local_looseness)	rF   r   r   r   r    r   r   r   rQ   r   )r   rf   r   rm   r   r]   rZ   r   lowerr   setaddr:   r   r?   r   r   )r   r   r   html_outputslab_evaluationsgirder_evaluationscrossbeam_evaluationsabutment_evaluationspier_evaluationsbearing_evaluationsra   bearing_dataexpansion_evaluationsexpansion_datapavement_evaluationsadjusted_damage_quantityr   pavement_datadrainage_evaluationsblocked_spansdrainage_datarailing_evaluationsrb   railing_datar,   r   r1   "generate_all_component_evaluations#  s   


	
$"
&
	


r  
has_damagec                 C      | rdS dS )u8   교량받침 손상에 따른 등급을 계산합니다.r   r   r,   r  r,   r,   r1   evaluate_bearing_grade     r	  c                 C   r  )u8   신축이음 손상에 따른 등급을 계산합니다.r   r   r,   r  r,   r,   r1   r     r
  r   c                 C   r  )u8   배수시설 손상에 따른 등급을 계산합니다.r   r   r,   r  r,   r,   r1   r     r
  r   c           3         s
  zUdgdgg ddgdgdgg ddd	gd
dgg dg dd}| |g }|s,g W S |dkrl| d jjd|dd}| d jjddd| d jjdddB }| ||B  }td|  d|  dt| d n:| d jjd|dd}| d jjddd| d jjdddB }| || @  }| dkrt| d|  d |jrg W S ddlm	}m
}	m}
m}m} g }t|d  }|D ]}||d |k }t|d d!d"}|d#v r|js|d jd n|d }|	| ||d$}|
| ||d$}|	| ||d%}|
| ||d%}||||||dkr|d& nd|dkr!|d& ndd' d}d}d}| D ]A\}}||d |}t|d( rIt|d( nd}|d) d*krX||7 }q0|d) d+kre||7 }q0|d) d,krp||7 }q0||d- dkr||d-  d  nd|d- dkr||d-  d  nd|d- dkr||d-  d  nd|||d. nZ|d/v r;d}d}d}| D ]R\}}|d  t|d( rt|d( nd}d0 v rdd1lm} | } | rt|| }| |d jd }|d) d+kr||7 }q|d) d,kr||7 }q||d2|d- dkr"||d-  d  nd|d- dkr2||d-  d  nd||d3 n|d4krd}d2}!d2}"d2}#| D ]<\}}|d  d0 v rkdd1lm} | } | rkt|| }t fd5d6d7D ryd8}!d9 v rd9}"d: v rd:}#qL|||!|"|#d; nr|dkrd2}$d}d2}%| D ]@\}}|d  t fd<d6d=D r d>d? }$d0 v rdd1lm} | } | rt|| }t fd@d6d7D rd8}%q||$||%dA n|dBkrLd2}$d2}&d2}%| D ]A\}}|d  t fdCd6dDD r d>d? }$d0 v r,t fdEd6dFD r,d0}&t fdGd6d7D r?dH v r?d8}%q||$|&|%dI n|dJkrd}dK}'dK}(| D ]W\}}|d  t|d( rqt|d( nd})t|dL rt|dL ndM}*d0 v r|* dNkr|)d&9 })||)7 }t fdOd6dPD rdQ}'dR v rdS v rdT}(q[||d- dkr||d-  d  nd|'|(|dU n9|dVkrd2}+d2},| D ]7\}}|d  dW v rt fdXd6dYD r d>dZ }+d[ v rt fd\d6d]D r d>dZ },q||+|,d^ n|d_krd}d}-d}.d}/d}d}| D ]y\}}|d  t|d( rGt|d( nd}d0 v r`dd1lm} | } | r`t|| }| |d jd }|d) d`krw|-|7 }-q1|d) dakr|.|7 }.q1|d) dbkr|/|7 }/q1|d) d+kr||7 }q1|d) d,kr||7 }q1|||d- dkr|-|d-  d  nd|d- dkr|.|d-  d  nd|d- dkr|/|d-  d  nd|d- dkr||d-  d  nd|d- dkr||d-  d  nd|-|.|/||dc g }0dd|v r |dd dkr |0d0|dd dedf dg|v r4|dg dkr4|0d+dedh di|v rH|di dkrH|0d,djdh ||0|dk< || q|W S  ty| }1 ztdlt|1  dd>l}2|2  g W  Y d>}1~1S d>}1~1ww )mu  
    부재별 상태평가 데이터를 생성합니다.
    
    Args:
        df: 부재별 집계표 DataFrame
        component_type: 부재 유형 ('slab', 'girder', 'crossbeam', 등)
        
    Returns:
        List[Dict]: 상태평가 데이터 리스트
    ro   rp   )rq   u	   세로보u   격벽rr   rs   u   기초)r   rt   u   받침장치u   탄성받침u   고무받침u   강재받침u	   베어링ru   r   rv   r   )rw   r   	   배수관)r   r   u   방호울타리u	   방호벽u	   방음벽u	   방음판u   방음u   방호u	   중분대u   중앙분리대u   가드레일u   낙석u   차광u	   경계석u   투석방지망)rx   ry   rz   r{   r|   
foundationr}   r~   r   r   r   r}   r   |F)nar   r   r   u&   교량받침 필터링 결과: 기본 u   개, 손상내용 기반 u	   개, 총 u   개r   u;    부재에서 제외된 받침/전단키 관련 데이터: r   )filter_positions_by_componentget_max_crack_width_for_spancalculate_crack_ratio_for_spanclassify_damage_for_evaluationcalculate_condition_grader   rE   r   )rF   inspection_arearQ   )rx   ry   rz   rN   rO   r   )crack_width_1dcrack_ratio_1dcrack_width_2dcrack_ratio_2doriginal_crack_length_1doriginal_crack_length_2dr   typer&   r)   r4   r  )r   r   r    original_leak_quantity original_surface_damage_quantity!original_rebar_corrosion_quantity)r{   r|   r%   )$extract_crack_width_from_descriptionr   )r   deformationr   r    r  r  r  c                 3   r*   r+   r,   r-   r0   r,   r1   r2   o  r3   z5generate_component_evaluation_data.<locals>.<genexpr>)   단면손상r'   r(   r!  u   세굴u   침하)r   damage_conditionerosion
settlementc                 3   r*   r+   r,   r-   r0   r,   r1   r2     r3   )r5   u   도장u   편기N
   c                 3   r*   r+   r,   r-   r0   r,   r1   r2     r3   )r   r   r   r~   c                 3   r*   r+   r,   r-   r0   r,   r1   r2     r3   )u   본체r   r   c                 3   r*   r+   r,   r-   r0   r,   r1   r2     r3   )   후타u   콘크리트c                 3   r*   r+   r,   r-   r0   r,   r1   r2     r3   r&  )r   footer_crackr   r   u   양호r   r   r   c                 3   r*   r+   r,   r-   r0   r,   r1   r2     r3   )r   u   패임u   들뜨u   소요u   배수u   불량r   )r   traffic_conditiondrainage_conditionoriginal_damage_quantityr   r   c                 3   r*   r+   r,   r-   r0   r,   r1   r2     r3   )r   r   r      r  c                 3   r*   r+   r,   r-   r0   r,   r1   r2     r3   )r   u   길이부족u   설치불량)outlet_conditionpipe_conditionr   u   도장손상r5   u   연결재손상)r   r   r   r   r   r    original_paint_damageoriginal_corrosion_ratiooriginal_connection_damager  r  r   medium)r  r   severityr   )r  r2  r    highrQ   u4   부재별 상태평가 데이터 생성 중 오류: )rZ   r   containsr   r   sumlenemptycondition_evaluationr  r  r  r  r  r^   r   ilocupdater   r   r   r8   r  r[   r:   r   r]   	Exception	traceback	print_exc)3r   rB   component_filterscomponent_keywordsbasic_bearing_maskbearing_damage_maskfiltered_df
basic_maskr  r  r  r  r  r_   	positionspositionpos_datarc   rn   r  r  r  r  leak_quantitysurface_damage_quantityrebar_corrosion_quantityr   r   damage_infor   rd   r  r   r"  r#  r$  r   r   r'  r(  r)  quantityr   r,  r-  r   r   connection_damagedamagesr   r<  r,   r0   r1   "generate_component_evaluation_data  s  *


    
	 

  
	







""
   




 

     rN  )r@   ).__doc__pandasr   r6   jsontypingr   r   r   r   r   utils.commonr   
evaluationr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r?   rf   rm   r   r   r   	DataFramer   r  boolr	  r   r   rN  r,   r,   r,   r1   <module>   s,    H C Y B  w" mB  