o
    +zh;                     @   s   d dl Z d dlZd dlZd dlmZmZmZmZ d dlZ	d dl
mZ d dlmZmZmZmZmZ d dlmZ d dlmZ dd Zd	d
 Zg dZdd ZdddZdS )    N)flashredirectsessionurl_for)damage_solutions)classify_repairget_db_connectionnormalize_damagesort_componentsclean_dataframe_data)natural_sort_key)BeautifulSoupc                    s    ddl   fdd}t| |dS )uC   부재위치를 자연 정렬 (s1, s2, s3... s10, s11... 순서로)r   Nc                    s     dt| }dd |D S )Nz(\d+)c                 S   s$   g | ]}|  rt|n| qS  )isdigitintlower).0partr   r   F/home/skpark/git/infrasmart_work/infrasmart/utils/pivot_detail_view.py
<listcomp>   s   $ z@natural_sort_key_positions.<locals>.sort_key.<locals>.<listcomp>)splitstr)positionpartsrer   r   sort_key   s   z,natural_sort_key_positions.<locals>.sort_keykey)r   sorted)	positionsr   r   r   r   natural_sort_key_positions   s   r!   c                 C   s   g }i }|   D ]V\}}|d }tddt|}||vr5|d ||d |dddd|ddd	||< || d
  |d
 7  < || d  |d 7  < t|| d |dd|| d< q| D ]}|| qct	|S )u(   거더 내부/외부 데이터를 통합   부재위치z[io]$ 	   부재명   손상내용   단위r      점검면적)r$   r"   r%   r&      손상물량   개소r'   r(   r)   )
iterrowsr   subr   getmaxvaluesappendpd	DataFrame)groupmerged_dataposition_map_rowr   base_positiondatar   r   r    merge_girder_positions_for_pivot   s.   





r9   )u	   바닥판u	   슬래브u   거더u   주형u	   가로보u	   세로보u   격벽u   교대u   교각   교량받침u   신축이음u   신축u   교면포장u   포장u   배수시설u	   배수구u   난간u   연석u	   방호벽u   방호울타리u   중대u	   방음벽u	   방음판u   점검시설u   점검u   점검계단c                 C   s   dd }t | |dS )Nc                 S   s*   t tD ]\}}|| v r|  S qttS N)	enumerateCOMPONENT_ORDERlen)nameidxkeywordr   r   r   component_keyI   s
   z&sort_components.<locals>.component_keyr   )r   )
componentsrB   r   r   r   r
   H   s   r
   Tc           >         s  t  }| }|d| td f | }|s!td ttdS |d }t|t	r/t
|}t|}t|}|r|d j	jddd	d
|d< |d j	jddd	d
|d< dd |jD }|r|d }	|d j	jddd}
d|j|
|	f t	 d |j|
df< |d j	jddd|d j	jdddB }d|j|df< t|d  }||d | }d}d}|D ]}||d |k }|jrqd}d}|rd}d}t||  }||  }tj|ddgg}tjd||d}d}d}|D ]}||| |k }|D ]D}||| |k }|js.t|d  d}t|d  }||j||dff< ||j||dff< qd|j||dff< d|j||dff< q||d   }||d   } t|d|j|df< t	t| |j|df< ||7 }|| 7 }qz\|rg }!|D ]&}||d |k }"|"jsd |"jv r|! |"d  j!d  q}|! d q}n+g }!|D ]&}||d |k }"|"jsd |"jv r|! |"d  j!d  q|! d qW n, t"y }# zt#d!|#  d"d t$|rt%|nt%|D }!W Y d }#~#nd }#~#ww t&|j}$t'd#d$ t(|$D t%|$}%|s|)|%d |! |)dd|gt%|  |r2|)d%d&| n|)d%d| |*d}d'gt%|j |jd'd d f< |D ]V}d}&d}'|D ]5}|j||dff }|j||dff }|dkr{|dkr{|&t+|7 }&|dkr|dkr|'t|7 }'qWt|&d|jd'|dff< t|'|jd'|dff< qOt|d|jd(< t||jd)< |j,d*ddd+d,}(t-|(d-})|).d.}*|*d /d/}+t	t%||+d0< |*d1d  D ]
},|,/d/0  q|*d .d2}-|-d }.d|.d0< |-d% }/d|/d0< |s|-t%|-d  }0d|0d0< |*d% .d2}1|1d 0  |1d% 0  |s.|1t%|1d1  0  t	|)}(|r|t-|(d-})|).d.}*d3d |*d% .d2D }-d}2d}3|-dt%|-d%  D ]}4|4j1d	d4}5|!|2 }6|5 d5|6 d6|4_2|2d%7 }2|3d%7 }3qYt	|)}(t3t4|d }7d75|7}8d8| d9|8 d:}9|d;| d<| d=7 }|d>| d?| d@|9 7 }|dA7 }||(7 }|dB7 }|dC7 }|d  D ]}t6|}:|dD| dE|: dF7 }zrt7| dG v rt8 fdHd$dID st9:dJ rdGt;v rt<=t;dG d};|;D ]}<|<dK|dL|:}=|dM|= dN7 }qn. t;v rBt%t;  dkrBt<=t;  d};|;D ]}<|<dK|dL|:}=|dM|= dN7 }q,W n
 t"yM   Y nw |dO7 }|dP7 }q|dO7 }q||fS )QNzISELECT file_data FROM uploaded_files WHERE filename = %s AND user_id = %suser_idu"   파일을 찾을 수 없습니다.indexr   r%   u   \(([\d.]+㎜)미만\)z(\1)T)regexu   \(([\d.]+㎜)이상\)c                 S   s   g | ]	}| d r|qS )u	   균열폭)
startswith)r   colr   r   r   r   o   s    z%pivot_detail_view.<locals>.<listcomp>u   균열\([\d.]+[m㎜]\)F)nau   균열(zmm)u   받침u	   전단키r:   r$   r#   r"   r(   r)   )rE   columns   -   합계r(   rN   r)   r&   u%   단위 값 처리 중 오류 발생: c                 S   s   g | ]}d qS )r#   r   )r   r5   r   r   r   r      s    c                 s   s:    | ]\}}t |tr|d  dkr|d dkr|V  qdS )r   rN      r(   N)
isinstancetuple)r   irH   r   r   r   	<genexpr>   s   
 z$pivot_detail_view.<locals>.<genexpr>rP   u   경간rN   )rN   rM   )rN   rO   ztable-bordered table-stripedleft)classesrE   borderjustifyzhtml.parsertrtdrowspan   thc                 S   s    g | ]}d |j ddv r|qS )r(   Tstrip)get_text)r   r]   r   r   r   r   )  s     r^   z ()z, z<p class='observation-summary'>u=   에 대한 외관조사결과에서 조사된 바와 같이, u&    등의 손상이 조사되었다.</p>z<a href="#header_um   " class="btn btn-outline-primary btn-sm m-1" style="background-color:#1976d2; color:#fff; border:none;">🔗 z</a>z[<div style="display:flex;justify-content:space-between;align-items:center;"><h4 id="header_uC   " style="margin-bottom:0; scroll-margin-top:80px;">📌 부재명: u   </h4><a href="#top" class="btn btn-light btn-sm" style="background-color:#f5f5f5; color:#1976d2; border:0px solid #1976d2; font-weight:bold; box-shadow:0 1px 4px rgba(25,118,210,0.08);">▲ 맨 위로</a></div>z<style>table.table-bordered { margin-left: 0 !important; width: auto !important; } table.table-bordered td { text-align: center !important; }</style><div class='table-container' >z</div>u3   <h5>🛠 손상별 원인 및 대책방안</h5><ul>u   <p><strong>🔸 손상내용: u    (보수방안: z)</strong></p><ul>u   균열c                 3   s    | ]}| v V  qd S r;   r   )r   xnormalized_dmgr   r   rT   a  s    )u   백태u   누수u   부u"   균열\(?[a-zA-Z]*=?[\d.]+(mm|㎜)z{name}u   {보수방안}z<li>z</li>z</ul>z<hr>)>r   cursorexecuter   fetchoner   r   r   rQ   r   jsonloadsr0   r1   r   replacerJ   matchlocastypecontainsr
   uniqueisinemptyr!   
MultiIndexfrom_productroundsumr   groupbyr/   r.   	Exceptionprintranger>   listnextr<   insertfillnafloatto_htmlr   find_allfind	decomposer`   stringr   setjoinr   r	   anyr   searchr   randomsample)>filenamepivotdetailconncurresult	file_datadf
crack_cols	crack_colmaskbearing_damage_maskunique_componentsdetail_htmldetail_html_header_linkr?   r2   header1colum1header1_valuecolum1_valuerJ   tabletotal_dmg_sumtotal_cnt_sumdmgr+   posrk   dmg_valcnt_val	total_dmg	total_cntunit_valuesdamage_rowsecol_listsum_idxpos_dmg_sumpos_cnt_sum
html_tablesouprowsfirst_tdrY   first_row_thsfirst_th	second_thend_thsecond_row_thsrS   zr]   header_textunitunique_damagesdamage_textsummaryrepair_methodselected_solutionssolutionformatted_solutionr   rc   r   pivot_detail_viewQ   s  



&


0






"

r   )T)rh   r   r   flaskr   r   r   r   pandasr0   static.data.damage_solutionsr   utils.commonr   r   r	   r
   r   utils.damage_utilsr   bs4r   r!   r9   r=   r   r   r   r   r   <module>   s    	$	