§
    JØ”jˆ%  ã                   ó¨   — U d dl 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
i Zeeeeef         f         ed<    G d„ d	¦  «        ZdS )
é    N)ÚAny)ÚErpDatabaseClient)Úget_settings)Ú	LLMClientzdscons.pricing_resolverÚ_MATERIAL_PRICE_CACHEc                   óÐ   — e Zd ZdZ	 	 ddedz  dedz  fd„Z	 	 	 	 dd	ed
edededz  dede	ee
f         fd„Z	 	 	 	 dd	ed
edededz  dede	ee
f         fd„Zde	ee
f         fd„ZdS )ÚPricingResolverServicez£
    Zero-Error Bidding Pricing Engine (High-Speed Cached 4-Tier Resolver)
    Resolves material prices with exact code, trigram similarity, and domain rules.
    NÚ
erp_clientÚ
llm_clientc                 ót   — |pt          ¦   «         | _        |pt          t          ¦   «         ¦  «        | _        d S )N)r   Ú_erp_clientr   r   Ú_llm_client)Úselfr
   r   s      úYC:\Projects\DSCons\app\modules\inventory\application\state_price_sync\pricing_resolver.pyÚ__init__zPricingResolverService.__init__   s7   € ð
 &Ð<Õ):Ñ)<Ô)<ˆÔØ%ÐB­µ<±>´>Ñ)BÔ)BˆÔÐÐó    Ú õ   Váº­t liá»‡ur   ÚkeywordÚcontextÚmaterial_groupÚmaterial_codeÚfallback_priceÚreturnc                 ó’  — |                      ¦   «                              ¦   «         › d|› d|pd› �}|t          v rt          |         S |                     ¦   «                               ¦   «         }|r|                     ¦   «         nd}d|v sd|v sd|v r*d|v sd|v sd|v rd	nd
|v rdnd}	|	dddddœ}
|
t          |<   |
S d|v rddddddœ}
|
t          |<   |
S d|v sd|v sd|v sd|v sd|v sd|v rddddddœ}
|
t          |<   |
S d|v rddddddœ}
|
t          |<   |
S d |v rd!|vrdnd"dd#dd$dœ}
|
t          |<   |
S 	 | j                             ¦   «         5 }|                     ¦   «         5 }|rr|                     d%|f¦  «         |                     ¦   «         }|rEt          |d&         ¦  «        dd'd|d(         dœ}
|
t          |<   |
cd)d)d)¦  «         cd)d)d)¦  «         S d)d)d)¦  «         n# 1 swxY w Y   d*}|                     |||f¦  «         | 	                    ¦   «         }|s+|                     d+|f¦  «         | 	                    ¦   «         }d)d)d)¦  «         n# 1 swxY w Y   |rK|d,         }t          |d&         ¦  «        }|d,k    r(||d-         d.k    rdnd/d0d|d(         dœ}
|
t          |<   |
S n4# t          $ r'}t                               d1|› �¦  «         Y d)}~nd)}~ww xY w|}|d,k    rId2|v rd3}nBd4|v sd5|v rd6}n7d7|v rd8}n0d|v rd9}n)d|v rd:}n"d;|v sd<|v rd}nd=|v rd>}nd?|v rd@}n	dA|v rdB}ndC}|d/dDd|dœ}
|
t          |<   |
S )EzbCore high-speed synchronous resolution (0.1ms) using domain rules and PostgreSQL trigram matching.ú|r   u   bá»‘c xáº¿pu   bá»‘c xuá»‘ngu
   bá»‘c dá»¡u   cÃ¡tu   Ä‘Ã¡u   sá»�iiðU  u   xi mÄƒngiÈ¯  iØÖ  ÚhighÚtransport_ruleFu9   CÆ°á»›c bá»‘c xáº¿p / bá»‘c dá»¡ Ä‘á»‹nh má»©c cÆ¡ giá»›i)ÚpriceÚ
confidenceÚsourceÚrequire_reviewÚmatched_nameu   váº­n chuyá»ƒniø$ u.   CÆ°á»›c váº­n chuyá»ƒn váº­t tÆ° / Ä‘áº¥t Ä‘Ã¡u   Ä‘áº¯p cÃ¡tu   cÃ¡t Ä‘áº¯pu	   san ná»�nu   Ä‘áº¯p ná»�niŒ Úsand_fill_ruleu&   CÃ¡t san ná»�n (Theo thÃ´ng bÃ¡o giÃ¡)u	   cá»�c trei„g  Úbamboo_stake_ruleu#   Cá»�c tre (giÃ¡ quy Ä‘á»•i 1 cá»�c)u   cá»« larsenu   thuÃªiÐ  Úlarsen_ruleu   Cá»« Larsen IVzcSELECT state_unit_price_vnd, material_name FROM erp_state_published_prices WHERE material_code = %sÚstate_unit_price_vndÚexact_code_matchÚmaterial_nameNah  
                    SELECT material_code, material_name, state_unit_price_vnd, similarity(material_name, %s) as sim_score
                    FROM erp_state_published_prices
                    WHERE (material_group = %s OR material_group IS NULL OR material_group = '')
                    ORDER BY sim_score DESC
                    LIMIT 3
                z¥SELECT material_code, material_name, state_unit_price_vnd, similarity(material_name, %s) as sim_score FROM erp_state_published_prices ORDER BY sim_score DESC LIMIT 3r   Ú	sim_scoregš™™™™™Ù?ÚmediumÚtrigram_db_searchz-SQL Trigram search error in PricingResolver: u	   bÃª tÃ´ngi` u   thÃ©pu   cá»‘t thÃ©piDH  u   vÃ¡n khuÃ´niðI i�Ð iÀE u   Ä‘Ã ou   xÃºcu   Ä‘áº¯pis u   bÆ¡mië	 u   xÃ³i hÃºt bÃ¹niL i † Údomain_fallback)ÚstripÚlowerr   r   Úget_connectionÚcursorÚexecuteÚfetchoneÚintÚfetchallÚ	ExceptionÚloggerÚdebug)r   r   r   r   r   r   Ú	cache_keyÚkw_lowerÚ	ctx_lowerÚp_valÚresÚconnÚcurÚrowÚqueryÚ
candidatesÚtop_candidater   ÚeÚdefault_prices                       r   Ú_resolve_corez$PricingResolverService._resolve_core   sÿ  € ð —}’}‘”×,Ò,Ñ.Ô.ÐWÐW°ÐWÐWÀ-ÐBUÐSUÐWÐWˆ	ØÕ-Ð-Ð-Ý(¨Ô3Ð3à—=’=‘?”?×(Ò(Ñ*Ô*ˆØ'.Ð6�G—M’M‘O”O�O°Bˆ	ð ˜HÐ$Ð$¨¸8Ð(CÐ(CÀ|ÐW_ÐG_ÐG_ð ˜hÐ&Ð&¨&°HÐ*<Ð*<ÀÈ8Ð@SÐ@Sð �à)¨XÐ5Ð5�e�e¸5ð ð Ø$Ø*Ø"'Ø [ðð ˆCð 03Õ! )Ñ,ØˆJà˜xÐ'Ð'àØ$Ø*Ø"'Ø Pðð ˆCð 03Õ! )Ñ,ØˆJð ˜XÐ%Ð%Ø Ð(Ð(Ø˜hÐ&Ð&Ø Ð)Ð)Ø Ð*Ð*Ø 	Ð)Ð)ð  Ø$Ø*Ø"'Ø Hðð ˆCð 03Õ! )Ñ,ØˆJð ˜(Ð"Ð"àØ$Ø-Ø"'Ø Eðð ˆCð 03Õ! )Ñ,ØˆJð ˜HÐ$Ð$à")°Ð"9Ð"9˜˜¸tØ$Ø'Ø"'Ø 0ðð ˆCð 03Õ! )Ñ,ØˆJð8	NØÔ!×0Ò0Ñ2Ô2ð $0°dØ—[’[‘]”]ð ' cà$ð 'ØŸšð BØ*Ð,ñô ð ð "Ÿlšl™nœn˜Øð 	'å),¨SÐ1GÔ-HÑ)IÔ)IØ.4Ø*<Ø27Ø03°OÔ0Dð#ð #˜Cð @CÕ1°)Ñ<Ø#&ð#'ð 'ð 'ð 'ñ 'ô 'ð 'ð$0ð $0ð $0ð $0ñ $0ô $0ð $0ð $0ð'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'ð(�ð —’˜E G¨^Ð#<Ñ=Ô=Ð=Ø Ÿ\š\™^œ^�
à!ð 0Ø—K’Kð @Ø ˜
ñô ð ð "%§¢¡¤�JðI$0ð $0ð $0ñ $0ô $0ð $0ð $0ð $0ð $0ð $0ð $0øøøð $0ð $0ð $0ð $0ðL ð Ø *¨1¤�Ý˜MÐ*@ÔAÑBÔB�Ø˜1’9�9à!&à(¨Ô5¸Ò;Ð;ð '- fà%Ø"5Ø*/Ø(5°oÔ(Fðð �Cð 8;Õ)¨)Ñ4Ø�Jøøåð 	Nð 	Nð 	NÝ�LŠLÐLÈÐLÐLÑMÔMÐMÐMÐMÐMÐMÐMøøøøð	Nøøøð 'ˆØ˜AÒÐØ˜hÐ&Ð&Ø '��Ø˜HÐ$Ð$¨¸Ð(AÐ(AØ %��Ø (Ð*Ð*Ø &��Ø˜8Ð#Ð#Ø &��Ø˜8Ð#Ð#Ø &��Ø˜HÐ$Ð$¨°(Ð(:Ð(:Ø %��Ø˜XÐ%Ð%Ø %��Ø˜8Ð#Ð#Ø &��Ø! XÐ-Ð-Ø %��à &�ð #Ø"Ø'Ø#Ø#ð
ð 
ˆð ,/Õ˜iÑ(Øˆ
so   Ä6J0 ÅIÅ$AG%Ç IÇJ0 ÇIÇ%G)	Ç)IÇ,G)	Ç-AIÉJ0 ÉIÉJ0 ÉIÉAJ0 Ê0
K!Ê:KËK!c              ƒ   ó:   K  — |                       |||||¬¦  «        S )z'Async interface for pricing resolution.©r   r   r   r   r   )rF   )r   r   r   r   r   r   s         r   Úresolve_material_pricez-PricingResolverService.resolve_material_priceÏ   s4   è è € ð ×!Ò!ØØØ)Ø'Ø)ð "ñ 
ô 
ð 	
r   c                 ó*  — |                      d¦  «        pt          |¦  «        dk    r|d         nd}|                      d¦  «        pt          |¦  «        dk    r|d         nd}|                      d¦  «        pt          |¦  «        dk    r|d         nd}|                      d	¦  «        pt          |¦  «        d
k    r|d
         nd}|                      d¦  «        pt          |¦  «        dk    r|d         nd}|                      |||||¬¦  «        S )z/Synchronous instant resolution wrapper (0.1ms).r   r   r   r   é   r   é   r   r   é   Nr   é   rH   )ÚgetÚlenrF   )r   ÚargsÚkwargsr   r   r   r   r   s           r   Úresolve_material_price_syncz2PricingResolverService.resolve_material_price_syncà   s$  € à—*’*˜YÑ'Ô'ÐMµs¸4±y´yÀ1²}°}¨D°¬G¨GÈ"ˆØ—*’*˜YÑ'Ô'ÐMµs¸4±y´yÀ1²}°}¨D°¬G¨GÈ"ˆØŸšÐ$4Ñ5Ô5ð 
Ý˜4‘y”y 1’}�}ˆD�ŒGˆG¨.ð 	ð Ÿ
š
 ?Ñ3Ô3ð 
Ý˜4‘y”y 1’}�}ˆD�ŒGˆG¨$ð 	ð  ŸšÐ$4Ñ5Ô5ð 
Ý˜4‘y”y 1’}�}ˆD�ŒGˆG¨!ð 	ð ×!Ò!ØØØ)Ø'Ø)ð "ñ 
ô 
ð 	
r   )NN)r   r   Nr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Ústrr4   Údictr   rF   rI   rS   © r   r   r	   r	      sk  € € € € € ðð ð 04Ø'+ðCð Cà%¨Ñ,ðCð  Ñ$ðCð Cð Cð Cð Ø,Ø$(Øðqð qàðqð ðqð ð	qð
 ˜T‘zðqð ðqð 
ˆc�3ˆhŒðqð qð qð qðl Ø,Ø$(Øð
ð 
àð
ð ð
ð ð	
ð
 ˜T‘zð
ð ð
ð 
ˆc�3ˆhŒð
ð 
ð 
ð 
ð"
¸dÀ3ÈÀ8¼nð 
ð 
ð 
ð 
ð 
ð 
r   r	   )ÚloggingÚtypingr   Úapp.core.postgres.erp_clientr   Úapp.core.settingsr   Ú)app.modules.agents.application.llm_clientr   Ú	getLoggerr7   r   rY   rX   Ú__annotations__r	   rZ   r   r   ú<module>rb      sÌ   ðØ €€€€Ø Ð Ð Ð Ð Ð à :Ð :Ð :Ð :Ð :Ð :Ø *Ð *Ð *Ð *Ð *Ð *Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?à	ˆÔ	Ð4Ñ	5Ô	5€ð 46Ð �t˜C  c¨3 h¤Ð/Ô0Ð 5Ð 5Ñ 5ðf
ð f
ð f
ð f
ð f
ñ f
ô f
ð f
ð f
ð f
r   