§
    è´Àj.&  ã                  ó¼  — 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  ej        d
¦  «        Z e
¦   «         Zd)d„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d*d(„¦   «         ZdS )+é    )ÚannotationsN)ÚPath)ÚAny)Ú	APIRouterÚBackgroundTasksÚDependsÚFileÚFormÚHTTPExceptionÚ
UploadFileÚstatus)Úrequire_role)Úget_drawing_takeoff_serviceé   )ÚSTORAGE_VAULTzdscons.api.takeoff.upload_batchÚfilenameÚstrÚreturnÚboolc                óÒ   ‡— |                       ¦   «         Št          | ¦  «        j                              ¦   «         }|dv rdS |dk    rg d¢}t          ˆfd„|D ¦   «         ¦  «        S dS )un   Kiá»ƒm tra xem file cÃ³ pháº£i lÃ  Há»“ sÆ¡ má»�i tháº§u / Biá»ƒu giÃ¡ / TiÃªn lÆ°á»£ng dá»± toÃ¡n hay khÃ´ng.©ú.xlsxú.xlsú.docú.docxú.csvTú.pdf)õ   tiÃªn lÆ°á»£ngú
tien luongõ
   dá»± toÃ¡núdu toanÚhsmtu   má»�i tháº§uzmoi thauu   biá»ƒu giÃ¡zbieu giau   bÃ¡o cÃ¡o ktktzbao cao ktktu   thuyáº¿t minhzthuyet minhÚbctmu   tá»•ng há»£pztong hopÚdutoanzbang giau   báº£ng giÃ¡c              3  ó    •K  — | ]}|‰v V — Œ	d S ©N© )Ú.0ÚkwÚfn_lowers     €úJC:\Projects\DSCons\app\modules\takeoff\presentation\upload_batch_routes.pyú	<genexpr>zis_hsmt_file.<locals>.<genexpr>9   s'   øè è € Ð:Ð: b�2˜�>Ð:Ð:Ð:Ð:Ð:Ð:ó    F)Úlowerr   ÚsuffixÚany)r   ÚextÚhsmt_keywordsr*   s      @r+   Úis_hsmt_filer3      s�   ø€ à�~Š~ÑÔ€HÝ
ˆx‰.Œ.Ô
×
%Ò
%Ñ
'Ô
'€CØ
Ð8Ð8Ð8ØˆtØ
ˆf‚}€}ð
ð 
ð 
ˆõ* Ð:Ð:Ð:Ð:¨MÐ:Ñ:Ô:Ñ:Ô:Ð:Øˆ5r-   z/upload-batchu|   Táº£i lÃªn Nhiá»�u Báº£n Váº½ Ká»¹ Thuáº­t & Há»“ SÆ¡ Má»�i Tháº§u CÃ¹ng LÃºc (Batch Upload) & GhÃ©p Cáº·p Khá»›p Ná»‘i KÃ©p)ÚsummaryÚstatus_code.uK   Danh sÃ¡ch cÃ¡c file báº£n váº½ CAD/PDF vÃ  file HSMT/Dá»± toÃ¡n Excel/Word)Ú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 chungTu6   Tá»± Ä‘á»™ng cháº¡y tiáº¿n trÃ¬nh AI bÃ³c tÃ¡ch ngáº§m)Ú
superadminÚdirectorÚmanagerÚengineerÚstaffÚbackground_tasksr   Úfilesúlist[UploadFile]Ú
project_idú
str | NoneÚdocument_idÚdrawing_hintÚauto_analyzeÚcurrent_userúdict[str, Any]c           
   ƒ  óÔ
  ‡ ‡!‡"‡#K  — |rt          |¦  «        dk    rt          dd¬¦  «        ‚t                               dt          |¦  «        d„ |D ¦   «         ¦  «         g d¢}t	          ¦   «         }g }	g }
|D �]PŠ"‰"j        sŒt          ‰"j        ¦  «        j                             ¦   «         }||vr"|
 	                    ‰"j        d|› d	�d
œ¦  «         Œ\t          ‰"j        ¦  «        j
        › dt          j        d¦  «                             ¦   «         › |› �}t          |z  Š 	 ddl}ˆ ˆ"fd„}|                     |¦  «        ƒ d{V —† |	 	                    ‰ ‰"j        |dœ¦  «         Œï# t"          $ rV}t                               d‰"j        |¦  «         |
 	                    ‰"j        t'          |¦  «        d
œ¦  «         Y d}~�ŒJd}~ww xY wg }g }|	D ]É}|d         }|dv r| 	                    |¦  «         Œ$|dv r| 	                    |¦  «         Œ>|dk    r…ddl}|                     |j        |d         ¦  «        ƒ d{V —†}|                     dd¦  «        r/|                     dd¦  «        |d<   | 	                    |¦  «         Œ´| 	                    |¦  «         ŒÊ|s|rt          dd¬¦  «        ‚g }|D �]K}d}t          |¦  «        dk    �rFg d¢}g d¢}t          |d         ¦  «        j
                             ¦   «         Š!|D ]M}t          |d         ¦  «        j
                             ¦   «         Š#t-          ˆ#fd „|D ¦   «         ¦  «        r|} nŒN|sd‰!rb|D ]_}t          |d         ¦  «        j
                             ¦   «         }t-          ˆ!fd!„|                     ¦   «         D ¦   «         ¦  «        r|} nŒ`|sP|D ]M}t          |d         ¦  «        j
                             ¦   «         Š#t-          ˆ#fd"„|D ¦   «         ¦  «        s|} nŒN|s|d         }|                     |d         |d         |||¬#¦  «        }t'          |d$         ¦  «        }|r|d         |d%<   t3          |t&          ¦  «        r)|                     ¦   «                              ¦   «         d&v}nt7          |¦  «        }|r@|                      |j        |||rt'          |d         ¦  «        nd|r|d         nd¬'¦  «         | 	                    |¦  «         �ŒMd(t          |¦  «        › d)�}|r#d*t          |¦  «        › d+t          |¦  «        › d,�}d-|t          |¦  «        t          |¦  «        t          |¦  «        ||
|d.œS )/u“   Táº£i lÃªn Ä‘á»“ng thá»�i nhiá»�u file, tá»± Ä‘á»™ng phÃ¢n loáº¡i Báº£n váº½ vs HSMT/Dá»± toÃ¡n vÃ  kÃ­ch hoáº¡t quy trÃ¬nh khá»›p ná»‘i kÃ©p 100%.r   i�  u$   KhÃ´ng cÃ³ file nÃ o Ä‘Æ°á»£c chá»�n)r5   Údetailz5[TAKEOFF] upload_batch_drawings received %d files: %sc                óR   — g | ]$}t          |d d¦  «        t          |dd¦  «        f‘Œ%S )r   NÚsize)Úgetattr)r(   Úfs     r+   ú
<listcomp>z)upload_batch_drawings.<locals>.<listcomp>]   s5   € ÐQÐQÐQÀa�'�!�Z Ñ
&Ô
&­°°6¸4Ñ(@Ô(@Ð	AÐQÐQÐQr-   )ú.dwgú.dxfr   ú.pngú.jpgú.jpegú.webpr   r   r   r   r   u   Ä�á»‹nh dáº¡ng 'u   ' khÃ´ng Ä‘Æ°á»£c há»— trá»£)r   ÚerrorÚ_é   Nc                 óŽ   •— t          ‰d¦  «        5 } t          j        ‰j        | ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NÚwb)ÚopenÚshutilÚcopyfileobjÚfile)ÚbufferÚ	dest_pathrL   s    €€r+   Ú	save_filez(upload_batch_drawings.<locals>.save_file†   s‰   ø€ Ý˜) TÑ*Ô*ð 7¨fÝÔ& q¤v¨vÑ6Ô6Ð6ð7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7ð 7ð 7s   ’:º>Á>)Úpathr   r1   u"   [TAKEOFF] Lá»—i lÆ°u file '%s': %sr1   r   )rN   rO   rP   rQ   rR   rS   r   r`   Úis_hsmtFÚsummary_reasonr7   Úclassification_reasonu–   Vui lÃ²ng táº£i lÃªn Ã­t nháº¥t má»™t file Báº£n váº½ ká»¹ thuáº­t (CAD/PDF) kÃ¨m theo Há»“ sÆ¡ má»�i tháº§u Ä‘á»ƒ AI Quá»³nh tiáº¿n hÃ nh bÃ³c tÃ¡ch.r   )u   biá»ƒu máº«uÚbieu_mauzbieu maur    Údu_toanr!   r   Ú
tien_luongr   Úboqu   khá»‘i lÆ°á»£ngÚ
khoi_luongu   phá»¥ lá»¥cÚphu_luczphu lucu   máº«u sá»‘ 01z	mau so 01)Úqdz
quyet dinhu   báº£o lÃ£nhzbao lanhu   thÆ° thu xáº¿pzthu thu xepu   tá»� trÃ¬nhzto trinhr   c              3  ó    •K  — | ]}|‰v V — Œ	d S r&   r'   )r(   r)   Úfnames     €r+   r,   z(upload_batch_drawings.<locals>.<genexpr>Æ   s'   øè è € Ð:Ð: r�r˜U�{Ð:Ð:Ð:Ð:Ð:Ð:r-   c              3  óF   •K  — | ]}t          |¦  «        d k    ¯|‰v V — ŒdS )é   N)Úlen)r(   ÚwÚdf_stems     €r+   r,   z(upload_batch_drawings.<locals>.<genexpr>Î   s1   øè è € ÐNÐN¨AÅ3ÀqÁ6Ä6ÈAÂ:À:˜1 ˜<À:À:À:À:ÐNÐNr-   c              3  ó    •K  — | ]}|‰v V — Œ	d S r&   r'   )r(   Úprefrl   s     €r+   r,   z(upload_batch_drawings.<locals>.<genexpr>Ö   s'   øè è € ÐJÐJ°˜t u˜}ÐJÐJÐJÐJÐJÐJr-   )Ú	file_pathr   r@   rB   rC   ÚidÚattached_hsmt_file)ÚfalseÚ0ÚnorL   Úoff)Ú
takeoff_idrC   Úattached_hsmt_pathÚattached_hsmt_filenameu   Ä�Ã£ tiáº¿p nháº­n u&    báº£n váº½ ká»¹ thuáº­t thÃ nh cÃ´ng.u   Ä�Ã£ tá»± Ä‘á»™ng phÃ¢n loáº¡i u    Báº£n váº½ vÃ  uI    Há»“ sÆ¡ má»�i tháº§u/Dá»± toÃ¡n kÃ¨m theo Ä‘á»ƒ khá»›p ná»‘i kÃ©p 100%!Úsuccess)r   ÚmessageÚcountÚdrawings_countÚhsmts_countÚtakeoffsÚerrorsÚis_async)ro   r   ÚloggerÚinfor   r   r   r/   r.   ÚappendÚstemÚosÚurandomÚhexr   ÚasyncioÚ	to_threadÚ	ExceptionrT   r   Úclassify_pdf_content_typeÚgetr0   ÚsplitÚcreate_pending_takeoffÚ
isinstanceÚstripr   Úadd_taskÚrun_takeoff_pipeline)$r=   r>   r@   rB   rC   rD   rE   Úallowed_extsÚserviceÚsaved_filesr„   Úfile_extÚ	safe_namer�   r_   ÚeÚdrawing_filesÚ
hsmt_filesÚsfr1   Ú	pdf_classÚcreated_takeoffsÚdfÚmatched_hsmtÚboq_keywordsÚnon_boq_prefixesÚhÚh_stemÚcreatedr{   Úis_auto_analyzeÚmsgr^   rq   rL   rl   s$                                   @@@@r+   Úupload_batch_drawingsr¬   =   s1  øøøøè è € ð4 ð \•C˜‘J”J !’O�OÝ¨Ð4ZÐ[Ñ[Ô[Ð[å
‡K‚KØ?ÝˆE‰
Œ
ØQÐQÈ5ÐQÑQÔQñô ð ðð ð €Lõ *Ñ+Ô+€Gð )+€KØ#%€Fàð !Eñ !EˆØŒzð 	ØÝ˜œ
Ñ#Ô#Ô*×0Ò0Ñ2Ô2ˆØ˜<Ð'Ð'Ø�MŠMà !¤
ØV°ÐVÐVÐVðð ñô ð ð å˜AœJÑ'Ô'Ô,ÐNÐN­r¬z¸!©}¬}×/@Ò/@Ñ/BÔ/BÐNÀHÐNÐNˆ	Ý! IÑ-ˆ	ð	EØˆNˆNˆNð7ð 7ð 7ð 7ð 7ð 7ð ×#Ò# IÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.à×Òà%Ø !¤
Ø#ðð ñô ð ð øõ ð 	Eð 	Eð 	EÝ�LŠLÐ=¸q¼zÈ1ÑMÔMÐMØ�MŠM q¤z½CÀ¹F¼FÐCÐCÑDÔDÐDÐDÐDÐDÐDÑDøøøøð	Eøøøð
 +-€MØ')€Jàð )ð )ˆØ�ŒiˆØÐ<Ð<Ð<Ø×Ò˜bÑ!Ô!Ð!Ð!ØÐFÐFÐFØ× Ò  Ñ$Ô$Ð$Ð$Ø�FŠ]ˆ]àˆNˆNˆNà%×/Ò/ØÔ1°2°f´:ñô ð ð ð ð ð ð ˆIð �}Š}˜Y¨Ñ.Ô.ð )Ø.7¯mªmÐ<LÈbÑ.QÔ.Q�Ð*Ñ+Ø×!Ò! "Ñ%Ô%Ð%Ð%à×$Ò$ RÑ(Ô(Ð(øð ð 
˜Zð 
ÝØð lð
ñ 
ô 
ð 	
ð .0ÐØð J)ñ J)ˆàˆÝˆz‰?Œ?˜aÒÑðð ð ˆLð
  Kð   Kð   KÐÝ˜2˜jœ>Ñ*Ô*Ô/×5Ò5Ñ7Ô7ˆGð  ð ð �Ý˜Q˜zœ]Ñ+Ô+Ô0×6Ò6Ñ8Ô8�ÝÐ:Ð:Ð:Ð:¨\Ð:Ñ:Ô:Ñ:Ô:ð Ø#$�LØ�Eðð
  ð  Gð Ø#ð ð �AÝ! ! J¤-Ñ0Ô0Ô5×;Ò;Ñ=Ô=�FÝÐNÐNÐNÐN°·²±´ÐNÑNÔNÑNÔNð Ø'(˜Ø˜ðð
  ð Ø#ð ð �AÝ   :¤Ñ/Ô/Ô4×:Ò:Ñ<Ô<�EÝÐJÐJÐJÐJÐ9IÐJÑJÔJÑJÔJð Ø'(˜Ø˜ðð
  ð -Ø)¨!œ}�à×0Ò0Ø˜”jØ˜
”^Ø!Ø#Ø%ð 1ñ 
ô 
ˆõ ˜ œÑ'Ô'ˆ
àð 	EØ,8¸Ô,DˆGÐ(Ñ)õ �l¥CÑ(Ô(ð 		1Ø*×0Ò0Ñ2Ô2×8Ò8Ñ:Ô:ð Cð ˆOˆOõ # <Ñ0Ô0ˆOàð 		Ø×%Ò%ØÔ,Ø%Ø)Ø@LÐ#V¥3 |°FÔ';Ñ#<Ô#<Ð#<ÐRVàð( |°JÔ'?Ð'?àð &ñ ô ð ð 	×Ò Ñ(Ô(Ð(Ñ(à
]¥Ð$4Ñ 5Ô 5Ð
]Ð
]Ð
]€CØð rð rµÐ4DÑ0EÔ0Eð  rð  rÕWZÐ[eÑWfÔWfð  rð  rð  rˆð ØÝÐ%Ñ&Ô&ÝÐ.Ñ/Ô/Ý˜:‘”Ø$ØØ#ð	ð 	ð 	s   Ä#AE'Å'
GÅ1AGÇG)r   r   r   r   )r=   r   r>   r?   r@   rA   rB   rA   rC   r   rD   r   rE   rF   r   rF   )Ú
__future__r   ÚloggingrŠ   rZ   Úpathlibr   Útypingr   Úfastapir   r   r   r	   r
   r   r   r   Ú"app.modules.auth.presentation.authr   Ú7app.modules.takeoff.application.drawing_takeoff_servicer   Úschemasr   Ú	getLoggerr†   Úrouterr3   ÚpostÚHTTP_201_CREATEDr¬   r'   r-   r+   ú<module>r¹      s#  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð <Ð ;Ð ;Ð ;Ð ;Ð ;Ø _Ð _Ð _Ð _Ð _Ð _à "Ð "Ð "Ð "Ð "Ð "à	ˆÔ	Ð<Ñ	=Ô	=€Ø	ˆ‰Œ€ðð ð ð ð@ ‡‚Øð KØÔ'ð ñ ô ð #˜dØØaðñ ô ð "˜T $Ð4UÐVÑVÔVØ"˜dØÐIðñ ô ð ˜˜RÐ-YÐZÑZÔZØ˜ØÐRðñ ô ð $+ 7ØˆØFÐFÐFñ	
ô 	
ñ$ô $ðNð Nð Nð Nñô ð
Nð Nð Nr-   