o
    "i                      @   sb   d Z ddlZddlmZmZmZ ddlmZ ddlZe	e
ZG dd dZdadefdd	ZdS )
u@   
智能分类服务
使用 AI 对税务文档进行自动分类
    N)OptionalDictList)Sessionc                   @   s   e Zd ZdZdd ZdededefddZd	edefd
dZ		ddede	dede
e	 de
e de	fddZdedefddZdedefddZdede	dedeee	f fddZdS )SmartCategorizationServiceu   智能分类服务c                 C   s   g dg ddg dg ddg dg ddg dd	d
gdg dddgdg dddgdg dddgdg dg ddg g dd	| _ dS )u   初始化分类服务)u   政策u   税收优惠u   减免u   扶持u   支持政策)u   关于.*政策u   .*优惠.*通知u   .*减免.*公告)keywordspatterns)u   征管u   管理办法u   征收u   缴纳u   申报)u
   .*征管.*u   .*管理办法u   .*征收.*规定)u   公告u   通知u   通告u   公示)u   .*公告u   .*通知u   .*通告)u   稽查u   检查u   核查u   审计u
   .*稽查.*u   .*检查.*通知)u   发票u   开票u   票据u
   .*发票.*u
   .*开票.*)   纳税服务u   便民u   服务指南u   办税u   .*纳税服务.*u
   .*办税.*)u   协定u   双边   税收协定u	   议定书u
   .*协定.*u   .*议定书)u   人才u   培训u   学员u   领军人才)u
   .*人才.*u
   .*培训.*u
   .*学员.*	u   税收政策u   征管规定u   公告通知u   税务稽查u   发票管理r	   r
   u   人才培养   其他N)
categories)self r   Q/lsinfo/ai/hellotax_ai/base_platform/app/services/knowledge/tax_categorization.py__init__   s8   z#SmartCategorizationService.__init__titlecontentreturnc                 C   s   |d |dd    }i }| j D ]*\}}d}|d D ]
}||v r'|d7 }q|d D ]}	t|	|r8|d7 }q,|||< qt| d	d
 d}
|
d dkrPdS td|
d  d|
d  d |
d S )u   
        根据文档标题和内容进行分类

        Args:
            title: 文档标题
            content: 文档内容

        Returns:
            分类名称
         Ni  r   r      r      c                 S   s   | d S )N   r   )xr   r   r   <lambda>Y   s    zBSmartCategorizationService.categorize_by_content.<locals>.<lambda>)keyr   r   zDocument categorization: z	 (score: ))lowerr   itemsresearchmaxloggerinfo)r   r   r   textscorescategoryrulesscorekeywordpatternbest_categoryr   r   r   categorize_by_content:   s$   
 z0SmartCategorizationService.categorize_by_contentfilenamec                 C   sB   |  }| j D ]\}}|d D ]}||v r|    S qq	dS )u   
        根据文件名进行简单分类

        Args:
            filename: 文件名

        Returns:
            分类名称
        r   r   )r   r   r   )r   r-   filename_lowerr&   r'   r)   r   r   r   categorize_by_filenameb   s   
z1SmartCategorizationService.categorize_by_filenameNdbknowledge_base_idcategory_name	parent_idyearc                 C   s   ddl m} |||j|k|j|k}|dur!||j|k}| }|r*|jS |r.dn| 	|}	| 
|}
||||rB| dn| d||	|
d}|| |  || td| d	|j d
 |jS )u*  
        获取或创建分类

        Args:
            db: 数据库会话
            knowledge_base_id: 知识库ID
            category_name: 分类名称
            parent_id: 父分类ID
            year: 年份（用于创建年份分类）

        Returns:
            分类ID
        r   )KnowledgeCategoryNu   📅u   年税务文档u   相关文档)r1   namedescriptionr3   iconcolorzCreated new category: z (ID: r   )app.models.knowledge_baser5   queryfilterr1   r6   r3   firstid_get_category_icon_get_category_coloraddcommitrefreshr"   r#   )r   r0   r1   r2   r3   r4   r5   r;   r&   r8   r9   new_categoryr   r   r   get_or_create_categoryu   s2   


	
z1SmartCategorizationService.get_or_create_categoryc              
   C   s$   dddddddddd		}| |dS )
u   获取分类图标u   📋u   📊u   📢u   🔍u   🧾u   🤝u   👨‍🎓u   📄r   get)r   r2   icon_mapr   r   r   r?         z-SmartCategorizationService._get_category_iconc              
   C   s$   ddddddddd	d
	}| |d	S )u   获取分类颜色z#3b82f6z#8b5cf6z#f59e0bz#ef4444z#10b981z#06b6d4z#ec4899z#6366f1z#6b7280r   rF   )r   r2   	color_mapr   r   r   r@      rI   z.SmartCategorizationService._get_category_colorc           	      C   sh   | j |||d|d}i }| j D ]}|dkr$| j ||||d}|||< q| j ||d|d}||d< |S )u   
        创建年份分类结构（年份 -> 二级分类）

        Args:
            db: 数据库会话
            knowledge_base_id: 知识库ID
            year: 年份

        Returns:
            分类名称到ID的映射
        N)r3   r4   r   )r3   )rE   r   keys)	r   r0   r1   r4   year_category_idcategory_mapr2   category_idother_idr   r   r   create_year_category_structure   s    
z9SmartCategorizationService.create_year_category_structure)NN)__name__
__module____qualname____doc__r   strr,   r/   r   intr   rE   r?   r@   r   rP   r   r   r   r   r      s>    *(
9
r   r   c                   C   s   t du rt a t S )u0   获取智能分类服务实例（单例模式）N)_categorization_servicer   r   r   r   r    get_smart_categorization_service   s   rX   )rT   loggingtypingr   r   r   sqlalchemy.ormr   r   	getLoggerrQ   r"   r   rW   rX   r   r   r   r   <module>   s    
 i