o
    bi=                  
   @   s  d dl mZmZmZmZmZ d dlmZmZ d dl	m
Z
mZmZmZmZmZmZ d dlmZmZ d dlZd dlZd dlZd dlZe ZG dd dZG dd	 d	Zed
kred zz[dZdZdZdZ dZ!dZ"edeee  ej#$ese%de e&d ej#'eZ(ej#$e(se)e( ede( eeee!e"ee Z*e*+ \Z,Z-e,dured ne%d W n e.y Z/ zej0de1e/dd W Y dZ/[/ndZ/[/ww W ed e2  dS W ed e2  dS ed e2  w dS )    )upload_image_to_cosget_image_memory_sizejson_formatsetup_loggingjson_to_excel)call_tongyi_ocr_streamcall_tongyi_ocr)COS_URL
MYSQL_HOST
MYSQL_PORT
MYSQL_USERMYSQL_PASSWORDMYSQL_DB	OCR_MODEL)Image	ImageDrawNc                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
WorkflowResultc                 C   s   || _ || _|| _|| _| d| d| | _|| _|| _t| j | _d| _	d| _
d| _d| _d| _d| _td|| td| td| td| td	| dS )
  初始化工作流结果对象
        Args:
            local_file_path (str): 本地文件路径
            cos_path_prefix (str): COS存储路径，不包含前面的域名部分
            file_id (str): 前端识别用的id
            filename (str): filename
            json_output_path (str): JSON输出文件路径
            excel_output_path (str): Excel输出文件路径
        /r   Nsuccess:   WorkflowResult对象初始化完成: 文件=%s, file_id=%s   本地文件路径: %s   COS路径前缀: %s   JSON输出路径: %s   Excel输出路径: %s)local_file_pathcos_path_prefixfile_idfilenamecos_pathjson_output_pathexcel_output_pathr	   cos_url_full	file_sizeocr_json_resultinput_tokensoutput_tokensocr_cost_timetask_statusloggerinfodebug)selfr   r   r   r   r!   r"    r.   7/home/project/hydrological_data_analyse/src/workflow.py__init__   s&   
zWorkflowResult.__init__c              
   C   s  t d| j d}t d| j t }z]t|d| j\| _| _	| _
tt | | _| jd u r=d| _t d| j W d S t| jddd	}|| j W d    n1 sVw   Y  t d
| j| j| j	| j
 t d| j W d S  ty } zd| _t jdt|dd  d }~ww )N   开始OCR识别单张图片: %s#  
        你是一个专业的OCR工具，识别图片里表格的内容：
        1. 检测出图片里完整的表格，如果表格不完整，则直接忽略
        2. 表格数据前31行表示一年中每一天的数据，竖向记录，一列表示一个月，识别时也要竖向识别，按月份返回数据。切记这是真实数据，只有一月、三月、五月、七月、八月、十月、十二月，有31天。二月只有28或者29天，其余月份只有30天
        3. 第32行记录的是平均数，若均值不存在，则对应值记录为None

        数据返回为JSON格式:{"1月": {"data": [0.1, 0.2], "avg": 0.3}, "2月": {...}}，每个月份数据的长度，要与这个月的天数相符。如果某个月份存在数据缺失，则用null进行填充
           准备处理图片: %s   识别图中的表格
ocr_failedu   OCR识别失败: %swzutf-8)encodinguH   OCR识别成功: 文件=%s, 耗时=%d秒, 输入token=%d, 输出token=%du   OCR结果已保存到: %s"   OCR识别过程中发生异常: %sTexc_info)r*   r+   r   r,   r    timer   r#   r%   r&   r'   intr(   r)   erroropenr!   write	Exceptionstr)r-   system_promptZocr_start_timefer.   r.   r/   llm_ocr_single_image0   s2   	
z#WorkflowResult.llm_ocr_single_imagec              
   C   sz  t d| j | j dst d| j dS t d| j t| j| j}|s4d| _	t 
d| j dS t d| j zt| j}t|| _t d	| j W n tyl } zt 
d
t| d| _W Y d}~nd}~ww |   | j	dkrt 
d| j	 dS zt d t| j}t|| j}t d W n ty } zt j
dt|dd W Y d}~dS d}~ww t d| j |S )  处理单个文件的工作流
        需要导入MySQL的数据:
            `id` bigint NOT NULL AUTO_INCREMENT COMMENT '唯一主键',
            `file_id` varchar(255) NOT NULL COMMENT 'web生成的id，也是cos的一个路径',
            `file_name` varchar(255) NOT NULL COMMENT '图片原始文件名',
            `file_storage_url` varchar(500) NOT NULL COMMENT '图片在云存储的地址(URL)',
            `ocr_json_result` longtext COMMENT 'OCR识别出的完整JSON结果',
            `file_size` bigint DEFAULT '0' COMMENT '图片文件大小（字节）',
            `task_status` varchar(20) NOT NULL DEFAULT 'uploading' COMMENT '任务状态: uploading(上传中), processing(识别中), success, failed',
            `ocr_engine` varchar(50) DEFAULT NULL COMMENT '使用的OCR引擎，如 tesseract, aliyun_ocr',
            `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '任务开始时间',
            `ocr_cost_time` float DEFAULT 0 COMMENT 'OCR处理完成时间',
            `input_tokens` int unsigned DEFAULT NULL COMMENT '本次OCR调用消耗的输入Token数',
            `output_tokens` int unsigned DEFAULT NULL COMMENT '本次OCR调用消耗的输出Token数',
        "   开始执行单文件工作流: %sz.pngz.jpgz.jpeg   跳过非图片文件: %sNN   开始上传文件到COS: %supload_failed   文件上传失败: %s   文件上传成功: %s   图片大小: %d 字节   获取图片大小失败: %sr   Nr   (   工作流处理失败，当前状态: %su   开始处理OCR结果u,   OCR结果处理完成，Excel文件已生成u"   处理OCR结果时发生异常: %sTr9   "   单文件工作流执行完成: %s)r*   r+   r   r   lowerendswithwarningr   r    r)   r=   r#   r   r>   r   r$   r,   r@   rA   rE   r   r%   r   r"   )r-   is_upload_successimagerD   json_resdata_detailr.   r.   r/   run_single_workflowT   sH   



z"WorkflowResult.run_single_workflowc              
   C   s.   | j | j| j| j| j| j| j| j| jd	}|S )   获取用于数据库插入的参数元组
        Returns:
            dict: 包含所有需要插入数据库的字段值
        	r   r   r#   r%   r$   r)   r(   r&   r'   r\   r-   	db_paramsr.   r.   r/   db_insert_params   s   zWorkflowResult.db_insert_paramsN__name__
__module____qualname__r0   rE   rZ   r_   r.   r.   r.   r/   r      s
    $>r   c                   @   r   )
WorkflowResultStreamc                 C   s   t t}|| _|| _|| _|| _| d| d| | _|| _|| _	t
| j | _d| _d| _|d|| |d| |d| |d| |d| d	S )
r   r   r   r   r   r   r   r   r   N)logging	getLoggerra   r   r   r   r   r    r!   r"   r	   r#   r$   r)   r+   r,   )r-   r   r   r   r   r!   r"   r*   r.   r.   r/   r0      s    

zWorkflowResultStream.__init__c              
   C   sj   t d| j d}t d| j z
t|d| j}|W S  ty4 } zd| _t j	dt
|dd  d }~ww )	Nr1   r2   r3   r4   r5   r8   Tr9   )r*   r+   r   r,   r    r   r#   r@   r)   r=   rA   )r-   rB   stream_outputrD   r.   r.   r/   rE      s   	z)WorkflowResultStream.llm_ocr_single_imagec              
   C   s  t d| j | j dst d| j dS t d| j t| j| j}|s4d| _	t 
d| j dS t d| j zt| j}t|| _t d	| j W n tyl } zt 
d
t| d| _W Y d}~nd}~ww |  }| j	dkrt 
d| j	 dS t d| j |S )rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r   Nr   rQ   rR   )r*   r+   r   r   rS   rT   rU   r   r    r)   r=   r#   r   r>   r   r$   r,   r@   rA   rE   )r-   rV   rW   rD   rg   r.   r.   r/   rZ      s4   

z(WorkflowResultStream.run_single_workflowc                 C   s   | j | j| j| j| jd}|S )r[   r   r   r#   r$   r)   rh   r]   r.   r.   r/   r_     s   z%WorkflowResultStream.db_insert_paramsNr`   r.   r.   r.   r/   rd      s
     4rd   __main__u,   === 水文数据分析程序开始运行 ===z2D:\project\hydrological_data_analyse\input\102.jpgzimages/ruiwenz>D:\project\hydrological_data_analyse\output\102_processed.jsonz;D:\project\hydrological_data_analyse\output\102_output.xlsxZtestfileid123z102.jpgu<   程序参数: 输入文件=%s, 输出JSON=%s, 输出Excel=%su   输入文件不存在: %s   u   创建输出目录: %su   程序执行成功完成u!   程序执行过程中出现错误u%   程序执行出现未预期错误: %sTr9   u,   === 水文数据分析程序运行结束 ===)3utilsr   r   r   r   r   Zcall_llmr   r   varr	   r
   r   r   r   r   r   ZPILr   r   osr;   	tracebackre   r*   r   rd   ra   r+   r   r   r!   r"   r   r   pathexistsr=   exitdirnameZ
output_dirmakedirsworkflowrZ   rY   Z_imager@   rD   criticalrA   shutdownr.   r.   r.   r/   <module>   sj    $  



 



