o
    "i                     @   sZ   d Z ddlmZmZ ddlmZ ddlZG dd dZG dd dZdad	efd
dZ	dS )u9   
向量化任务管理
用于跟踪文档向量化进度
    )DictOptional)datetimeNc                   @   sp   e Zd ZdZddedefddZedefdd	Zd
d Z	defddZ
dd ZdefddZdefddZdS )VectorizationTasku   向量化任务   document_idtotal_chunksc                 C   s.   || _ || _d| _d| _d | _d | _d | _d S )Nr   pending)r   r   completed_chunksstatuserror_message
started_atcompleted_at)selfr   r    r   Y/lsinfo/ai/hellotax_ai/base_platform/app/services/knowledge/vectorization_task_manager.py__init__   s   
zVectorizationTask.__init__returnc                 C   s   | j dkrdS | j| j  d S )u   获取进度百分比r   g        d   )r   r
   r   r   r   r   progress   s   
zVectorizationTask.progressc                 C   s   d| _ t | _dS )u   开始任务
processingN)r   r   nowr   r   r   r   r   start   s   zVectorizationTask.start	completedc                 C   s
   || _ dS )u   更新进度N)r
   )r   r   r   r   r   update_progress"   s   
z!VectorizationTask.update_progressc                 C   s   d| _ t | _| j| _dS )   完成任务r   N)r   r   r   r   r   r
   r   r   r   r   complete&   s   
zVectorizationTask.completeerrorc                 C   s   d| _ || _t | _dS )   任务失败failedN)r   r   r   r   r   )r   r   r   r   r   fail,   s   zVectorizationTask.failc              	   C   sF   | j | j| j| j| j| j| jr| j nd| jr| j dS ddS )u   转换为字典N)r   r   r   r   r
   r   r   r   )	r   r   r   r   r
   r   r   	isoformatr   r   r   r   r   to_dict2   s   zVectorizationTask.to_dictNr   )__name__
__module____qualname____doc__intr   propertyfloatr   r   r   r   strr!   dictr#   r   r   r   r   r   
   s    	r   c                   @   s   e Zd ZdZdd Zddededefdd	Zdedee fd
dZ	dedefddZ
defddZdedefddZdefddZdefddZddefddZdS )VectorizationTaskManageru   向量化任务管理器c                 C   s   i | _ t | _d S )N)tasks	threadingLocklockr   r   r   r   r   C   s   z!VectorizationTaskManager.__init__r   r   r   r   c                 C   sB   | j  t||}|| j|< |W  d   S 1 sw   Y  dS )u   创建新任务N)r2   r   r/   )r   r   r   taskr   r   r   create_taskG   s
   

$z$VectorizationTaskManager.create_taskc                 C   s6   | j  | j|W  d   S 1 sw   Y  dS )u   获取任务N)r2   r/   getr   r   r   r   r   get_taskN   s   
$z!VectorizationTaskManager.get_taskr   c                 C   V   | j  | j|}|r|| W d   dS W d   dS 1 s$w   Y  dS )u   更新任务进度N)r2   r/   r5   r   )r   r   r   r3   r   r   r   update_taskS      "z$VectorizationTaskManager.update_taskc                 C   sT   | j  | j|}|r|  W d   dS W d   dS 1 s#w   Y  dS )r   N)r2   r/   r5   r   )r   r   r3   r   r   r   complete_taskZ   s   
"z&VectorizationTaskManager.complete_taskr   c                 C   r8   )r   N)r2   r/   r5   r!   )r   r   r   r3   r   r   r   	fail_taska   r:   z"VectorizationTaskManager.fail_taskc                 C   sN   | j  || jv r| j|= W d   dS W d   dS 1 s w   Y  dS )u   移除任务N)r2   r/   r6   r   r   r   remove_taskh   s   

"z$VectorizationTaskManager.remove_taskc                 C   s>   | j  dd | j D W  d   S 1 sw   Y  dS )u   获取所有任务c                 S   s   g | ]}|  qS r   )r#   ).0r3   r   r   r   
<listcomp>q   s    z:VectorizationTaskManager.get_all_tasks.<locals>.<listcomp>N)r2   r/   valuesr   r   r   r   get_all_tasksn   s   $z&VectorizationTaskManager.get_all_tasks  max_age_secondsc                 C   s   | j 5 t }g }| j D ]\}}|jr&||j  }||kr&|| q|D ]}| j|= q)W d   dS 1 s;w   Y  dS )u"   清理旧任务（默认1小时）N)r2   r   r   r/   itemsr   total_secondsappend)r   rC   r   	to_removedoc_idr3   ager   r   r   cleanup_old_taskss   s   

"z*VectorizationTaskManager.cleanup_old_tasksNr$   )rB   )r%   r&   r'   r(   r   r)   r   r4   r   r7   r9   r;   r,   r<   r=   listrA   rJ   r   r   r   r   r.   @   s    r.   r   c                   C   s   t du rt a t S )u-   获取任务管理器实例（单例模式）N)_task_managerr.   r   r   r   r   get_task_manager   s   rM   )
r(   typingr   r   r   r0   r   r.   rL   rM   r   r   r   r   <module>   s    6D