
    XjY                          d dl mZm Z mZ d dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ  ee          ZdZd	Zd Zd
dhZh dZh dZ G d d          ZdedefdZdS )    )datedatetime	timedeltaN)
get_logger)Session)TaxDocument)CategoryProcessor)ProcessorEngine            >            >         r   c            	          e Zd ZddedefdZefdededefdZd	efd
e	e         d	z  dede	e         fdZ
de	e         fdZdded	z  fdZdeded	z  de	e         d	z  fdZddedededefdZddededefdZddeded	z  dedefdZd	S )IncrementalUpdater   dbrequest_timeoutc                 r    || _         || _        t                      | _        t	          |          | _        d S )N)timeout)r   r   r	   category_processorr
   _engine)selfr   r   s      a/lsinfo/ai/hellotax_ai/data_center/backend/app/services/tax_data_processor/incremental_updater.py__init__zIncrementalUpdater.__init__   s4    &"3"5"5&???    category_idwindow_daysreturnc           
        K   | j                             |          }|s|d| dS t                              d| d|d          d| d           |dk    r6t	          j                    t          |	          z
                                  nd }|                     ||           d {V }||d
g g ddS t                              d| dt          |           d|sdn| d d           g }g }d}|D ]}	|	d         }
| j
                            t                                        t          j        |
k                                              }||                    |	           t|                     |
||           d {V }|r|                    |	           |dz  }t                              d| dt          |           dt          |           d|            ||d         |||d dS )Nu   未知分类ID: )r!   erroru   [增量] 检查分类 u   （nameu   ），窗口=u   天r   )daysu   获取文档列表失败)r!   r%   new_documentsupdated_documentsskippedu   [增量] 分类 u    候选文档 u    条（u   全部u	   天窗口u   ）urlr!   r   u    完成: 新增=    更新=u    跳过=)r!   category_namer(   r)   r*   r%   )r   get_category_configloggerinfor   utcnowr   r   _fetch_candidate_listlenr   queryr   filter
source_urlfirstappend_is_content_changed)r   r!   r"   configcutoff
candidatesr(   r)   r*   docdoc_urldb_docchangeds                r   check_category_updatesz)IncrementalUpdater.check_category_updates   s     (<<[II 	[#.9YK9Y9YZZZj[jjVF^jjZejjjkkkZehiZiZix009+3N3N3NNTTVVVos55k6JJJJJJJJ
#.9Sfh  @B  OP  Q  Q  Q  W{  W  W#j//  W  Wkq  \Q[c[c  {F  xQ  xQ  xQ  W  W  W  	X  	X  	X$&(* 
	 
	C%jGW]];//66{7MQX7XYY__aaF~$$S))) 44WfR]4^^^^^^^^G !((----1  J{  J  JCDVDV  J  J`cdu`v`v  J  J  AH  J  J  	K  	K  	K*VF^^k  CT  ah  sw  x  x  	xr    Ncategory_idsc                   K   |+t          | j        j                                                  }g }|D ]4}|                     ||           d {V }|                    |           5t          d |D                       }t          d |D                       }t                              dt          |           d| d|            |S )Nr"   c              3   \   K   | ]'}t          |                    d g                     V  (dS )r(   Nr4   get.0rs     r   	<genexpr>z6IncrementalUpdater.check_categories.<locals>.<genexpr>>   s8      IIAAEE/26677IIIIIIr    c              3   \   K   | ]'}t          |                    d g                     V  (dS )r)   NrG   rI   s     r   rL   z6IncrementalUpdater.check_categories.<locals>.<genexpr>?   s9      QQAC&92 > >??QQQQQQr    u   [增量] 全部 u    类检查完成: 新增=r-   )
listr   
CATEGORIESkeysrB   r9   sumr0   r1   r4   )r   rC   r"   resultscidresult	total_newtotal_updateds           r   check_categoriesz#IncrementalUpdater.check_categories7   s       7 B G G I IJJL 	# 	#C66s6TTTTTTTTFNN6""""IIIIIII	QQQQQQQus<'8'8uuS\uufsuuvvvr    c                 H   K   |                      t                     d {V S )NrE   )rW   DAILY_WINDOW_DAYS)r   s    r   check_all_categoriesz'IncrementalUpdater.check_all_categoriesC   s0      **7H*IIIIIIIIIr    c                 R   t          j                    }| j                            t                    }|#|                    t          j        |k              }|                    d|id           | j                                         t          
                    d|            d S )Nlast_check_timeF)synchronize_sessionu-   [增量] 更新 last_check_time: category_id=)r   r2   r   r5   r   r6   r!   updatecommitr0   r1   )r   r!   nowr5   s       r   update_last_check_timez)IncrementalUpdater.update_last_check_timeF   s    ok**"LL!8K!GHHE'-5IIIQKQQRRRRRr    r<   c                   K   	 | j                             |           d {V }nL# t          $ r?}t                              d| d|                     d                     Y d }~d S d }~ww xY w||S g }|D ]}|                    d          }|s|                    |           /	 t          |          }||k    r|                    |           [# t          $ r |                    |           Y |w xY w|S )Nu   [增量] 获取分类 u    列表失败: T)	exceptionr   )	r   fetch_all_documents	Exceptionr0   r%   optrH   r9   _parse_date)	r   r!   r<   all_docsefilteredr>   doc_date_strdoc_dates	            r   r3   z(IncrementalUpdater._fetch_candidate_listO   sJ     	!4HHUUUUUUUUHH 	 	 	LLQ+QQaQQUU`dUeefff44444	 >O 
	% 
	%C776??L $$$%&|44v%%OOC((( % % %$$$$$%s&    % 
A.4A))A.)*CC65C6r   r+   r@   c                   K   	 t          j        | j        d          4 d {V }|                    |           d {V }|j        dv r9t
                              d|j         d|            	 d d d           d {V  dS |j                            d          }d d d           d {V  n# 1 d {V swxY w Y   n9# t          $ r,}t
                              d| d	|            d }Y d }~nd }~ww xY w|ro|j
        rh	 d
dlm}  ||          }	t          |	                    d           |j
        z
                                            }
|
dk     rdS n# t          $ r Y nw xY w|                     ||j        |           d {V S )NT)r   follow_redirects)i  i  u   [增量] 文档已失效 (z): Fzlast-modifiedu4   [增量] HEAD 请求失败，降级为 hash 对比:     — r   )parsedate_to_datetime)tzinfo<   r,   )httpxAsyncClientr   headstatus_coder0   warningheadersrH   re   
updated_atemail.utilsrp   absreplacetotal_seconds_hash_changedcontent_hash)r   r+   r@   r!   clientresplast_modified_strri   rp   last_modifieddiffs              r   r:   z&IncrementalUpdater._is_content_changede   s     		%(PTUUU F F F F F F FY_#[[--------#z11NN#Z@P#Z#ZUX#Z#Z[[[ 	F F F F F F F F F F F F F F
 %)L$4$4_$E$E!F F F F F F F F F F F F F F F F F F F F F F F F F F F  	% 	% 	%NN_RU__\]__``` $	%  	!2 	====== 5 56G H HM111>>ARRaaccdd"99 5    ''V-@k'ZZZZZZZZZsZ   !C AB/0C B/C /
B99C <B9=C 
C7"C22C7AE 
E('E(r   	source_idc                   K   ddl m} ddlm}m} ddlm}  |            }| j                            |          	                    |j
        |k                                              }|s|ddS 	 t          |j        |j        |j        |j                  }	 |||	          }
d | j                            |j                  	                    |j        |k                                              D             }g }|
                                2 3 d {V }|j        |vr"|                    |j        |j        d	           36 ||g d
S # t0          $ r}|t3          |          dcY d }~S d }~ww xY w)Nr   )get_settings)
DataSourcer   )get_adapteru   数据源不存在)r   r%   )r   max_retries	delay_min	delay_maxc                     h | ]
}|d          S r    rI   s     r   	<setcomp>z2IncrementalUpdater.check_source.<locals>.<setcomp>   s    1!A$r    )r+   title)r   r(   r)   )
app.configr   app.models.tax_datar   r   (app.services.tax_data_processor.adaptersr   r   r5   r6   idr8   r
   crawler_request_timeoutr   request_delay_minrequest_delay_maxr7   r   alllist_all_documentsr+   r9   r   re   str)r   r   r"   r   r   r   r   settingssourceengineadapter
local_urlsr(   itemri   s                  r   check_sourcezIncrementalUpdater.check_source{   s     ++++++????????HHHHHH<>>z**11*-92LMMSSUU 	K!*5IJJJ
	=$X-M[a[my  zR  ^d  ^v  w  w  wF!k&&11Gk6L(M(M(T(TU`UjnwUw(x(x(|(|(~(~JM%88:: Q Q Q Q Q Q Qd8:--!((DJ)O)OPPP ; "+]acddd 	= 	= 	=!*SVV<<<<<<<<	=s+   1B E E3E 
E1E,&E1,E1stored_hashc                   K   |sdS 	 | j                             ||d           d {V }|r|                    d          st                              d|            dS |                    dd          }n8# t
          $ r+}t                              d| d	|            Y d }~dS d }~ww xY w|r%||k    rt                              d
|            dS dS )NTz/tmpsuccessu7   [增量] process_document 失败，跳过 hash 对比: Fr    u%   [增量] hash 对比异常，跳过: ro   u%   [增量] hash 变化，标记更新: )r   process_documentrH   r0   rw   re   r1   )r   r+   r   r!   rT   new_hashri   s          r   r~   z IncrementalUpdater._hash_changed   s      	4	<88k6RRRRRRRRF I!6!6 ^Y\^^___uzz."55HH 	 	 	NNP3PPQPPQQQ55555	  	K//KKEEEFFF4us   AA7  A7 7
B, B''B,)r   )Nr   )r   )__name__
__module____qualname__r   intr   rY   dictrB   rN   rW   rZ   ra   r   r3   r   r   boolr:   r   r~   r   r    r   r   r      s       @ @7 @S @ @ @ @ O` x x x# xdh x x x x6 EI[l 
 
49t3C 
WZ 
quvzq{ 
 
 
 
JDJ J J J JS S#* S S S Ss D4K TXY]T^aeTe    ,[ [S [+ [TW [^b [ [ [ [,= =C =c = = = = =( s t RU \`      r    r   date_strr#   c                     |                                  } dD ];}	 t          j        | |                                          c S # t          $ r Y 8w xY wt	          d|            )N)z%Y-%m-%dz%Y/%m/%du   %Y年%m月%d日z%Y.%m.%du   无法解析日期: )stripr   strptimer   
ValueError)r   fmts     r   rg   rg      s    ~~HF  	$Xs3388::::: 	 	 	H	
6H66
7
77s   &A
AA)r   r   r   rs   common_loggingr   sqlalchemy.ormr   r   r   2app.services.tax_data_processor.category_processorr	   0app.services.tax_data_processor.processor_enginer
   r   r0   rY   WEEKLY_WINDOW_DAYSFULL_CHECK_WINDOW_DAYSDAILY_CATEGORIESWEEKLY_CATEGORIESMEDIUM_CATEGORIESr   r   rg   r   r    r   <module>r      s"   . . . . . . . . . .  % % % % % % " " " " " " + + + + + + P P P P P P L L L L L L	H		   q6 II II J J J J J J J JX8# 8$ 8 8 8 8 8 8r    