§
    CµÀjY#  ã                  ó   — d dl mZ d dlZd dlZd dlZd dl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 d dlmZ d dlmZ d dlmZ d	d
lmZ  ej        d¦  «        Z e
¦   «         Ze                     ddej        ¬¦  «         edd¬¦  «         edd¬¦  «         edd¬¦  «         edd¬¦  «         edd¬¦  «         e eg d¢¦  «        ¦  «        fd2d'„¦   «         Ze                     d(d)ej        ¬¦  «         edd*¬¦  «         edd¬¦  «         edd¬¦  «         edd¬¦  «         e eg d¢¦  «        ¦  «        fd3d+„¦   «         Z e                     d,d-¬.¦  «         edd/¬¦  «         e eg d¢¦  «        ¦  «        fd4d1„¦   «         Z!dS )5é    )ÚannotationsN)ÚPath)ÚAny)Ú	APIRouterÚBackgroundTasksÚDependsÚFileÚFormÚHTTPExceptionÚ
UploadFileÚstatus)Úrequire_role)ÚErpDatabaseClient)Úget_drawing_takeoff_serviceé   )ÚSTORAGE_VAULTz dscons.api.takeoff.upload_singlez/uploadu\   Táº£i lÃªn Báº£n váº½ CAD / PDF SiÃªu Tá»‘c & Tá»± Ä‘á»™ng KÃ­ch hoáº¡t BÃ³c tÃ¡ch AI Ngáº§m)ÚsummaryÚstatus_code.u+   File báº£n váº½ CAD DWG, DXF, PDF, PNG, JPG)Údescriptionu   MÃ£ UUID Dá»± Ã¡n (tÃ¹y chá»�n)u-   MÃ£ UUID VÄƒn báº£n liÃªn káº¿t (tÃ¹y chá»�n)Ú u:   Ghi chÃº cáº¥u kiá»‡n / loáº¡i mÃ³ng / vá»‹ trÃ­ kÃªnh kÃ¨Tu6   Tá»± Ä‘á»™ng cháº¡y tiáº¿n trÃ¬nh AI bÃ³c tÃ¡ch ngáº§m)Ú
superadminÚdirectorÚmanagerÚengineerÚstaffÚbackground_tasksr   Úfiler   Ú
project_idú
str | NoneÚdocument_idÚdrawing_hintÚstrÚauto_analyzeÚboolÚcurrent_userúdict[str, Any]Úreturnc                óÒ  — |j         st          dd¬¦  «        ‚g d¢}t          |j         ¦  «        j                             ¦   «         }||vrt          dd|› d�¬¦  «        ‚t          |j         ¦  «        j        › dt          j        d¦  «                             ¦   «         › |› �}	t          |	z  }
	 t          |
d	¦  «        5 }t          j        |j        |¦  «         d
d
d
¦  «         n# 1 swxY w Y   nA# t          $ r4}t                               d|¦  «         t          dd|› �¬¦  «        ‚d
}~ww xY wt#          ¦   «         }|                     |
|j         |||¬¦  «        }t'          |d         ¦  «        }t)          |t&          ¦  «        r)|                     ¦   «                              ¦   «         dv}nt-          |¦  «        }|r|                      |j        ||¬¦  «         dd||dœS )u‡   Táº£i lÃªn file báº£n váº½ ká»¹ thuáº­t trong vÃ i chá»¥c mili-giÃ¢y vÃ  chuyá»ƒn cÃ´ng Ä‘oáº¡n bÃ³c tÃ¡ch AI sang tiáº¿n trÃ¬nh ná»�n.é�  õ   TÃªn file khÃ´ng há»£p lá»‡©r   Údetail©z.dwgz.dxfú.pdfz.pngz.jpgz.jpegz.webpõ   Ä�á»‹nh dáº¡ng file 'õK   ' khÃ´ng Ä‘Æ°á»£c há»— trá»£. Vui lÃ²ng táº£i lÃªn DWG, DXF, PDF, PNG, JPG.Ú_é   ÚwbNõ(   [TAKEOFF] Lá»—i lÆ°u file báº£n váº½: %séô  õ#   KhÃ´ng thá»ƒ lÆ°u file báº£n váº½: ©Ú	file_pathÚfilenamer   r    r!   Úid)ÚfalseÚ0ÚnoÚfÚoff)Ú
takeoff_idr!   Úsuccessu^   Ä�Ã£ táº£i lÃªn báº£n váº½ thÃ nh cÃ´ng. Tiáº¿n trÃ¬nh bÃ³c tÃ¡ch AI Ä‘ang cháº¡y trong ná»�n.)r   ÚmessageÚtakeoffÚis_async)r9   r   r   ÚsuffixÚlowerÚstemÚosÚurandomÚhexr   ÚopenÚshutilÚcopyfileobjr   Ú	ExceptionÚloggerÚerrorr   Úcreate_pending_takeoffr"   Ú
isinstanceÚstripr$   Úadd_taskÚrun_takeoff_pipeline)r   r   r   r    r!   r#   r%   Úallowed_extsÚfile_extÚsafe_filenameÚ	dest_pathÚbufferÚeÚserviceÚcreated_takeoffr@   Úis_auto_analyzes                    úKC:\Projects\DSCons\app\modules\takeoff\presentation\upload_single_routes.pyÚupload_drawing_fastr`      s‹  € ð2 Œ=ð SÝ¨Ð4QÐRÑRÔRÐRàMÐMÐM€LÝ�D”MÑ"Ô"Ô)×/Ò/Ñ1Ô1€HØ�|Ð#Ð#ÝØð A¨8ð  Að  Að  Að
ñ 
ô 
ð 	
õ ˜DœMÑ*Ô*Ô/ÐQÐQµ"´*¸Q±-´-×2CÒ2CÑ2EÔ2EÐQÀxÐQÐQ€MÝ Ñ-€Ið_Ý�)˜TÑ"Ô"ð 	2 fÝÔ˜tœy¨&Ñ1Ô1Ð1ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2øøåð _ð _ð _Ý�ŠÐ?ÀÑCÔCÐCÝ¨Ð4]ÐZ[Ð4]Ð4]Ð^Ñ^Ô^Ð^øøøøð_øøøõ
 *Ñ+Ô+€GØ×4Ò4ØØ”ØØØ!ð 5ñ ô €Oõ �_ TÔ*Ñ+Ô+€Jõ �,¥Ñ$Ô$ð 	-Ø&×,Ò,Ñ.Ô.×4Ò4Ñ6Ô6ð ?
ð 
ˆˆõ ˜|Ñ,Ô,ˆð ð 
Ø×!Ò!ØÔ(Ø!Ø%ð 	"ñ 	
ô 	
ð 	
ð ØsØ"Ø#ð	ð ð s<   Â0C3 Ã C'ÃC3 Ã'C+Ã+C3 Ã.C+Ã/C3 Ã3
D1Ã=/D,Ä,D1z/upload-and-analyzeub   Táº£i lÃªn Báº£n váº½ CAD / PDF & Tá»± Ä‘á»™ng BÃ³c tÃ¡ch Khá»‘i lÆ°á»£ng AI Vision (Ä�á»“ng bá»™)u!   File báº£n váº½ CAD PDF, PNG, JPGc              ƒ  óÖ  K  — | j         st          dd¬¦  «        ‚g d¢}t          | j         ¦  «        j                             ¦   «         }||vrt          dd|› d�¬¦  «        ‚t          | j         ¦  «        j        › dt          j        d¦  «                             ¦   «         › |› �}t          |z  }	 t          |d	¦  «        5 }	t          j        | j        |	¦  «         d
d
d
¦  «         n# 1 swxY w Y   nA# t          $ r4}
t                               d|
¦  «         t          dd|
› �¬¦  «        ‚d
}
~
ww xY wt#          ¦   «         }|                     || j         |||¬¦  «        ƒ d
{V —†}|S )uw   Táº£i lÃªn báº£n váº½ thiáº¿t káº¿ ká»¹ thuáº­t thi cÃ´ng vÃ  cháº¡y AI Vision bÃ³c tÃ¡ch khá»‘i lÆ°á»£ng tá»± Ä‘á»™ng.r)   r*   r+   r-   r/   r0   r1   r2   r3   Nr4   r5   r6   r7   )r9   r   r   rE   rF   rG   rH   rI   rJ   r   rK   rL   rM   r   rN   rO   rP   r   Úprocess_drawing_file)r   r   r    r!   r%   rV   rW   rX   rY   rZ   r[   r\   Úresults                r_   Úupload_and_analyze_drawingrd   t   s  è è € ð* Œ=ð SÝ¨Ð4QÐRÑRÔRÐRàMÐMÐM€LÝ�D”MÑ"Ô"Ô)×/Ò/Ñ1Ô1€HØ�|Ð#Ð#ÝØð A¨8ð  Að  Að  Að
ñ 
ô 
ð 	
õ ˜DœMÑ*Ô*Ô/ÐQÐQµ"´*¸Q±-´-×2CÒ2CÑ2EÔ2EÐQÀxÐQÐQ€MÝ Ñ-€Ið_Ý�)˜TÑ"Ô"ð 	2 fÝÔ˜tœy¨&Ñ1Ô1Ð1ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2øøåð _ð _ð _Ý�ŠÐ?ÀÑCÔCÐCÝ¨Ð4]ÐZ[Ð4]Ð4]Ð^Ñ^Ô^Ð^øøøøð_øøøõ
 *Ñ+Ô+€GØ×/Ò/ØØ”ØØØ!ð 0ñ ô ð ð ð ð ð ð €Fð €Ms<   Â2C5 ÃC)ÃC5 Ã)C-Ã-C5 Ã0C-Ã1C5 Ã5
D3Ã?/D.Ä.D3z/{takeoff_id}/attach-hsmtuh   Ä�Ã­nh kÃ¨m / Bá»• sung Há»“ SÆ¡ Má»�i Tháº§u (HSMT / TiÃªn LÆ°á»£ng Excel) Ä‘á»ƒ Khá»›p Ná»‘i KÃ©p 100%)r   u;   File HSMT / TiÃªn lÆ°á»£ng Excel (.xlsx, .xls, .pdf, .docx)r@   c              ƒ  óÒ  K  — |j         st          dd¬¦  «        ‚g d¢}t          |j         ¦  «        j                             ¦   «         }||vrt          dd|› d�¬¦  «        ‚d| dd	…         › d
t          |j         ¦  «        j        › |› �}t          |z  }t          |d¦  «        5 }t          j	        |j
        |¦  «         ddd¦  «         n# 1 swxY w Y   t          ¦   «         }|                     | ¦  «        }	|	st          dd¬¦  «        ‚t          ¦   «         }
|
                     | d|j         › �t          |¦  «        |j         ¬¦  «        ƒ d{V —† |                     | ¦  «        pi }|                     d¦  «        pd}|                     d¦  «        pd}|                     d¦  «        p
d|j         › d�}|                     | |||j         |dœ¦  «         dd|j         › d�| dœS )u‰   Ä�Ã­nh kÃ¨m file HSMT vÃ o há»“ sÆ¡ bÃ³c tÃ¡ch hiá»‡n táº¡i vÃ  cháº¡y láº¡i quy trÃ¬nh Ä‘á»‘i soÃ¡t kÃ©p Ä‘áº¡t Ä‘á»™ tin cáº­y 98-100%.r)   r*   r+   )z.xlsxz.xlsz.docz.docxr.   r/   uW   ' khÃ´ng Ä‘Æ°á»£c há»— trá»£. Vui lÃ²ng táº£i lÃªn Excel (.xlsx, .xls) hoáº·c PDF/Word.ÚHSMT_Né   r1   r3   i”  u&   KhÃ´ng tÃ¬m tháº¥y há»“ sÆ¡ bÃ³c tÃ¡chu!   Há»“ sÆ¡ má»�i tháº§u bá»• sung: )r@   r!   Úattached_hsmt_pathÚattached_hsmt_filenameÚconfidence_scoreéc   Úconfidence_levelÚhsmt_verifiedÚai_report_messageu:   ThÆ°a sáº¿p, em Ä‘Ã£ tiáº¿p nháº­n Há»“ sÆ¡ má»�i tháº§u 'uK   ' do sáº¿p bá»• sung vÃ  cáº­p nháº­t bÃ³c tÃ¡ch danh má»¥c cÃ´ng tÃ¡c BoQ.)rj   rl   Úhsmt_reference_filern   rA   u   Ä�Ã£ bá»• sung HSMT 'u0   ' vÃ  chuáº©n hÃ³a 100% bÃ³c tÃ¡ch thÃ nh cÃ´ng!)r   rB   r@   )r9   r   r   rE   rF   rG   r   rK   rL   rM   r   r   Úget_drawing_takeoffr   rU   r"   ÚgetÚupdate_drawing_takeoff)r@   r   r%   rV   rW   Ú	safe_namerY   rZ   ÚclientrC   r\   Úupdated_takeoffÚ
conf_scoreÚconf_lvlÚrep_msgs                  r_   Úattach_hsmt_to_takeoffry   ¬   sÃ  è è € ð  Œ=ð SÝ¨Ð4QÐRÑRÔRÐRà=Ð=Ð=€LÝ�D”MÑ"Ô"Ô)×/Ò/Ñ1Ô1€HØ�|Ð#Ð#ÝØð M¨8ð  Mð  Mð  Mð
ñ 
ô 
ð 	
ð
 N˜
 2 A 2œÐMÐM­¨d¬mÑ)<Ô)<Ô)AÐMÀ8ÐMÐM€IÝ 	Ñ)€IÝ	ˆi˜Ñ	Ô	ð . &ÝÔ˜4œ9 fÑ-Ô-Ð-ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .õ Ñ Ô €FØ×(Ò(¨Ñ4Ô4€GØð ^Ý¨Ð4\Ð]Ñ]Ô]Ð]å)Ñ+Ô+€GØ
×
&Ò
&ØØH¸¼ÐHÐHÝ˜y™>œ>Ø#œ}ð	 'ñ ô ð ð ð ð ð ð ð ð ×0Ò0°Ñ<Ô<ÐBÀ€OØ ×$Ò$Ð%7Ñ8Ô8Ð>¸B€JØ×"Ò"Ð#5Ñ6Ô6ÐI¸/€HØ×!Ò!Ð"5Ñ6Ô6ð ð	BÀTÄ]ð 	Bð 	Bð 	Bð ð
 ×!Ò!Øà *Ø (Ø#'¤=Ø!(ð		
ð 	
ñô ð ð Øj¨4¬=ÐjÐjÐjØ ðð ð s   Â&CÃCÃC)r   r   r   r   r   r   r    r   r!   r"   r#   r$   r%   r&   r'   r&   )r   r   r   r   r    r   r!   r"   r%   r&   r'   r&   )r@   r"   r   r   r%   r&   r'   r&   )"Ú
__future__r   ÚloggingrH   rL   Úpathlibr   Útypingr   Úfastapir   r   r   r	   r
   r   r   r   Ú"app.modules.auth.presentation.authr   Úapp.core.postgres.erp_clientr   Ú7app.modules.takeoff.application.drawing_takeoff_servicer   Úschemasr   Ú	getLoggerrO   ÚrouterÚpostÚHTTP_201_CREATEDr`   rd   ry   © ó    r_   ú<module>r‰      sx  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð <Ð ;Ð ;Ð ;Ð ;Ð ;Ø :Ð :Ð :Ð :Ð :Ð :Ø _Ð _Ð _Ð _Ð _Ð _à "Ð "Ð "Ð "Ð "Ð "à	ˆÔ	Ð=Ñ	>Ô	>€Ø	ˆ‰Œ€ð ‡‚ØØjØÔ'ð ñ ô ð �t˜CÐ-ZÐ[Ñ[Ô[Ø!˜T $Ð4UÐVÑVÔVØ"˜dØÐIðñ ô ð ˜Ø
ÐTðñ ô ð ˜ØÐRðñ ô ð $+ 7ØˆØFÐFÐFñ	
ô 	
ñ$ô $ðNð Nð Nð Nñô ð
Nðb ‡‚ØØpØÔ'ð ñ ô ð �t˜CÐ-PÐQÑQÔQØ!˜T $Ð4UÐVÑVÔVØ"˜dØÐIðñ ô ð ˜Ø
ÐTðñ ô ð $+ 7ØˆØFÐFÐFñ	
ô 	
ñ$ô $ð0ð 0ð 0ð 0ñô ð
0ðf ‡‚ØØvð ñ ô ð �tØÐVðñ ô ð $+ 7ØˆØFÐFÐFñ	
ô 	
ñ$ô $ð@ð @ð @ð @ñ	ô ð@ð @ð @rˆ   