File size: 4,145 Bytes
846aae3
 
bc8daa2
f876056
846aae3
 
 
 
 
f876056
 
 
 
 
 
 
 
bc8daa2
846aae3
 
 
 
 
 
 
 
 
 
 
 
 
f876056
846aae3
f876056
846aae3
 
 
 
 
 
f876056
846aae3
f876056
846aae3
f876056
846aae3
 
f876056
846aae3
f876056
846aae3
 
 
f876056
846aae3
 
f876056
 
bc8daa2
846aae3
 
 
f876056
 
 
846aae3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f876056
 
 
 
 
846aae3
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# app.py
import gradio as gr
import logging # Import logging
import sys # Import sys
# Removed imports: pandas, openpyxl, datetime, timedelta, os, tempfile

# Import the processing function from main.py
from main import process_files

# Configure logging (consistent with main.py)
# Note: If main.py is imported, its basicConfig might already run.
# Re-configuring here ensures app.py specific logs also follow the format.
# Using getLogger and adding handler might be more robust in complex scenarios,
# but basicConfig is often sufficient for simpler apps.
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s',
                    stream=sys.stderr)

def generate_report(file1_obj, file2_obj):
    """
    Gradio wrapper function to handle file uploads and call the main processing logic.

    Args:
        file1_obj: Gradio File object for the first input file.
        file2_obj: Gradio File object for the second input file.

    Returns:
        str: Path to the generated output Excel file if successful.
    Raises:
        gr.Error: If file processing fails.
    """
    logging.info("generate_report function called by Gradio.")
    if file1_obj is None or file2_obj is None:
        logging.error("One or both files were not provided.")
        raise gr.Error("Please upload both required files.")

    try:
        # Gradio provides temporary paths for uploaded files
        file1_path = file1_obj.name
        file2_path = file2_obj.name
        logging.info(f"Input file paths received: file1='{file1_path}', file2='{file2_path}'")

        # Define the output filename (can be customized if needed)
        output_filename = "generated_report.xlsx"
        logging.info(f"Target output base filename: {output_filename}")

        # Call the core processing logic from main.py
        logging.info(f"Calling main.process_files...")
        result_path = process_files(file1_path, file2_path, output_filename)
        logging.info(f"main.process_files returned: '{result_path}'")

        if result_path:
            # Return the path of the generated file for Gradio to serve
            logging.info(f"Report generation successful. Returning path: {result_path}")
            return result_path
        else:
            # If process_files returned None, it means an error occurred (already logged in main.py)
            logging.error("main.process_files indicated failure (returned None).")
            raise gr.Error("Failed to generate the report. Check application logs for details.")

    except Exception as e:
        # Catch any other unexpected errors during the wrapper execution
        # Log the exception with traceback before raising Gradio error
        logging.exception(f"An unexpected error occurred in the Gradio wrapper (generate_report): {e}")
        raise gr.Error(f"An unexpected error occurred. Check application logs.")


# Create Gradio Interface
inputs = [
    gr.File(label="上传数据源文件 (类似 1.xls)"),
    gr.File(label="上传模板文件 (类似 2.xlsx)")
]
outputs = gr.File(label="下载生成的报告")

title = "Quality Inspection Report Generator" # Use English title
description = "Upload the data source file and template file to generate the combined quality inspection report." # Use English description

# Ensure interface runs on the default port 7860
# share=False is default and recommended for custom deployments
# server_name="0.0.0.0" makes it accessible within the container/network
demo = gr.Interface(
    fn=generate_report,
    inputs=inputs,
    outputs=outputs,
    title=title,
    description=description,
    allow_flagging='never' # Disable flagging
)

if __name__ == "__main__":
    # Setup logging for direct script execution as well
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s',
                        stream=sys.stderr)
    logging.info("Starting Gradio application...")
    # Launch the Gradio app
    demo.launch(server_name="0.0.0.0") # Port defaults to 7860