From 6628f663b636675bcaea316f2deaddf337de480e Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期五, 13 三月 2026 10:23:31 +0800
Subject: [PATCH] feat(米重分析): 新增稳态识别和预测功能页面并优化现有模型

---
 app/pages/extruder_parameter_adjustment.py |  675 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 675 insertions(+), 0 deletions(-)

diff --git a/app/pages/extruder_parameter_adjustment.py b/app/pages/extruder_parameter_adjustment.py
new file mode 100644
index 0000000..113aa28
--- /dev/null
+++ b/app/pages/extruder_parameter_adjustment.py
@@ -0,0 +1,675 @@
+import streamlit as st
+import plotly.express as px
+import plotly.graph_objects as go
+import pandas as pd
+import numpy as np
+import joblib
+import os
+from datetime import datetime
+from app.services.parameter_adjustment_service import ParameterAdjustmentAdvisor
+
+# 椤甸潰鍑芥暟瀹氫箟
+def show_extruder_parameter_adjustment():
+    # 椤甸潰鏍囬
+    st.title("鎸ゅ嚭鏈哄弬鏁拌皟鑺傚缓璁�")
+    
+    # 娣诲姞鎿嶄綔鎸囧紩
+    with st.expander("馃摉 鎿嶄綔鎸囧紩", expanded=True):
+        st.markdown("""
+        娆㈣繋浣跨敤鎸ゅ嚭鏈哄弬鏁拌皟鑺傚缓璁姛鑳斤紒鏈姛鑳藉彲浠ユ牴鎹偍杈撳叆鐨勭背閲嶆暟鎹拰褰撳墠鍙傛暟锛屼负鎮ㄦ彁渚涚瀛﹀悎鐞嗙殑鍙傛暟璋冩暣寤鸿銆�
+        
+        **鎿嶄綔姝ラ锛�**
+        1. 閫夋嫨涓�涓凡璁粌濂界殑妯″瀷
+        2. 杈撳叆绫抽噸鏍囧噯鍊笺�佷笂涓嬮檺鍜屽綋鍓嶆尋鍑烘満鍙傛暟
+        3. 杈撳叆褰撳墠瀹為檯绫抽噸娴嬮噺鍊�
+        4. 鐐瑰嚮"璁$畻璋冭妭寤鸿"鎸夐挳
+        5. 鏌ョ湅绯荤粺鐢熸垚鐨勫弬鏁拌皟鏁村缓璁�
+        
+        **娉ㄦ剰浜嬮」锛�**
+        - 璇风‘淇濊緭鍏ョ殑鍙傛暟鍊煎湪璁惧鍏佽鐨勮寖鍥村唴
+        - 寤鸿鏍规嵁瀹為檯鐢熶骇鎯呭喌璋冩暣妯″瀷鍙傛暟
+        - 鍘嗗彶璋冭妭璁板綍鍙湪椤甸潰搴曢儴鏌ョ湅
+        """)
+    
+    # 鍒濆鍖栦細璇濈姸鎬�
+    if 'adjustment_history' not in st.session_state:
+        st.session_state['adjustment_history'] = []
+    
+    # 1. 妯″瀷閫夋嫨鍖哄煙
+    with st.expander("馃攳 妯″瀷閫夋嫨", expanded=True):
+        # 鍒涘缓妯″瀷鐩綍锛堝鏋滀笉瀛樺湪锛�
+        model_dir = "saved_models"
+        os.makedirs(model_dir, exist_ok=True)
+        
+        # 鑾峰彇鎵�鏈夊凡淇濆瓨鐨勬ā鍨嬫枃浠�
+        model_files = [f for f in os.listdir(model_dir) if f.endswith('.joblib')]
+        model_files.sort(reverse=True)  # 鏈�鏂扮殑妯″瀷鎺掑湪鍓嶉潰
+        
+        if not model_files:
+            st.warning("灏氭湭淇濆瓨浠讳綍妯″瀷锛岃鍏堣缁冩ā鍨嬪苟淇濆瓨銆�")
+            return
+        
+        # 妯″瀷閫夋嫨涓嬫媺妗�
+        selected_model_file = st.selectbox(
+            "閫夋嫨宸蹭繚瀛樼殑妯″瀷",
+            options=model_files,
+            help="閫夋嫨瑕佺敤浜庨娴嬬殑妯″瀷鏂囦欢"
+        )
+        
+        # 鍔犺浇骞舵樉绀烘ā鍨嬩俊鎭�
+        if selected_model_file:
+            model_path = os.path.join(model_dir, selected_model_file)
+            model_info = joblib.load(model_path)
+            
+            # 鏄剧ず妯″瀷鍩烘湰淇℃伅
+            st.subheader("馃搳 妯″瀷淇℃伅")
+            info_cols = st.columns(2)
+            
+            with info_cols[0]:
+                st.metric("妯″瀷绫诲瀷", model_info['model_type'])
+                st.metric("鍒涘缓鏃堕棿", model_info['created_at'].strftime('%Y-%m-%d %H:%M:%S'))
+                st.metric("浣跨敤绋虫�佹暟鎹�", "鏄�" if model_info.get('use_steady_data', False) else "鍚�")
+            
+            with info_cols[1]:
+                st.metric("R虏 寰楀垎", f"{model_info['r2_score']:.4f}")
+                st.metric("鍧囨柟璇樊 (MSE)", f"{model_info['mse']:.6f}")
+                st.metric("鍧囨柟鏍硅宸� (RMSE)", f"{model_info['rmse']:.6f}")
+            
+            # 鏄剧ず妯″瀷鐗瑰緛
+            st.write("馃攽 妯″瀷浣跨敤鐨勭壒寰�:")
+            st.code(", ".join(model_info['features']))
+            
+            # 濡傛灉鏄繁搴﹀涔犳ā鍨嬶紝鏄剧ず搴忓垪闀垮害
+            if 'sequence_length' in model_info:
+                st.metric("搴忓垪闀垮害", model_info['sequence_length'])
+            
+            # 淇濆瓨妯″瀷淇℃伅鍒颁細璇濈姸鎬�
+            st.session_state['selected_model'] = model_info
+            st.session_state['selected_model_file'] = selected_model_file
+    
+    # 2. 鍙傛暟杈撳叆鍖哄煙
+    st.subheader("馃摑 鍙傛暟杈撳叆")
+    
+    # 2.1 绫抽噸鏍囧噯鍊笺�佷笂涓嬮檺杈撳叆
+    with st.expander("鈿栵笍 绫抽噸鏍囧噯涓庝笂涓嬮檺", expanded=True):
+        weight_cols = st.columns(3)
+        
+        with weight_cols[0]:
+            standard_weight = st.number_input(
+                "鏍囧噯绫抽噸",
+                key="standard_weight",
+                value=5.20,
+                min_value=0.01,
+                max_value=10.0,
+                step=0.0001,
+                format="%.4f",
+                help="杈撳叆鐩爣绫抽噸鏍囧噯鍊�"
+            )
+            st.caption("鍗曚綅: Kg/m")
+        
+        with weight_cols[1]:
+            upper_limit = st.number_input(
+                "绫抽噸涓婇檺",
+                key="upper_limit",
+                value=5.46,
+                min_value=standard_weight,
+                max_value=10.0,
+                step=0.0001,
+                format="%.4f",
+                help="杈撳叆绫抽噸鍏佽鐨勪笂闄愬��"
+            )
+            st.caption("鍗曚綅: Kg/m")
+        
+        with weight_cols[2]:
+            lower_limit = st.number_input(
+                "绫抽噸涓嬮檺",
+                key="lower_limit",
+                value=5.02,
+                min_value=0.01,
+                max_value=standard_weight,
+                step=0.0001,
+                format="%.4f",
+                help="杈撳叆绫抽噸鍏佽鐨勪笅闄愬��"
+            )
+            st.caption("鍗曚綅: Kg/m")
+    
+    # 2.2 鎸ゅ嚭鏈哄綋鍓嶅弬鏁拌緭鍏�
+    with st.expander("馃敡 鎸ゅ嚭鏈哄綋鍓嶅弬鏁�", expanded=True):
+        param_cols = st.columns(3)
+        
+        with param_cols[0]:
+            current_screw_speed = st.number_input(
+                "铻烘潌杞��",
+                key="current_screw_speed",
+                value=230.0,
+                min_value=0.0,
+                max_value=500.0,
+                step=0.1,
+                help="杈撳叆褰撳墠铻烘潌杞��"
+            )
+            st.caption("鍗曚綅: rpm")
+            
+            current_head_pressure = st.number_input(
+                "鏈哄ご鍘嬪姏",
+                key="current_head_pressure",
+                value=0.26,
+                min_value=0.0,
+                max_value=500.0,
+                step=1.0,
+                help="杈撳叆褰撳墠鏈哄ご鍘嬪姏"
+            )
+            st.caption("鍗曚綅: bar")
+            
+            current_process_speed = st.number_input(
+                "娴佺▼涓婚��",
+                key="current_process_speed",
+                value=6.6,
+                min_value=0.0,
+                max_value=300.0,
+                step=0.1,
+                help="杈撳叆褰撳墠娴佺▼涓婚��"
+            )
+            st.caption("鍗曚綅: m/min")
+        
+        with param_cols[1]:
+            current_screw_temperature = st.number_input(
+                "铻烘潌娓╁害",
+                key="current_screw_temperature",
+                value=79.9,
+                min_value=0.0,
+                max_value=300.0,
+                step=1.0,
+                help="杈撳叆褰撳墠铻烘潌娓╁害"
+            )
+            st.caption("鍗曚綅: 掳C")
+            
+            current_rear_barrel_temperature = st.number_input(
+                "鍚庢満绛掓俯搴�",
+                key="current_rear_barrel_temperature",
+                value=79.9,
+                min_value=0.0,
+                max_value=300.0,
+                step=1.0,
+                help="杈撳叆褰撳墠鍚庢満绛掓俯搴�"
+            )
+            st.caption("鍗曚綅: 掳C")
+        
+        with param_cols[2]:
+            current_front_barrel_temperature = st.number_input(
+                "鍓嶆満绛掓俯搴�",
+                key="current_front_barrel_temperature",
+                value=80.1,
+                min_value=0.0,
+                max_value=300.0,
+                step=1.0,
+                help="杈撳叆褰撳墠鍓嶆満绛掓俯搴�"
+            )
+            st.caption("鍗曚綅: 掳C")
+            
+            current_head_temperature = st.number_input(
+                "鏈哄ご娓╁害",
+                key="current_head_temperature",
+                value=95.1,
+                min_value=0.0,
+                max_value=300.0,
+                step=1.0,
+                help="杈撳叆褰撳墠鏈哄ご娓╁害"
+            )
+            st.caption("鍗曚綅: 掳C")
+    
+    # 2.3 褰撳墠瀹為檯绫抽噸娴嬮噺鍊艰緭鍏�
+    with st.expander("馃搹 褰撳墠瀹為檯绫抽噸", expanded=True):
+        actual_weight = st.number_input(
+            "褰撳墠瀹為檯绫抽噸",
+            key="actual_weight",
+            value=5.115,
+            min_value=0.01,
+            max_value=10.0,
+            step=0.0001,
+            format="%.4f",
+            help="杈撳叆褰撳墠瀹為檯娴嬮噺鐨勭背閲嶅��"
+        )
+        st.caption("鍗曚綅: Kg/m")
+    
+    # 3. 璁$畻璋冭妭寤鸿
+    st.subheader("馃殌 璁$畻璋冭妭寤鸿")
+    
+    # 娣诲姞杩唬璋冩暣閫夐」
+    use_iterative_adjustment = st.checkbox("馃攧 浣跨敤杩唬璋冩暣", value=False, 
+                                           help="鍚敤杩唬璋冩暣锛岃嚜鍔ㄤ紭鍖栧弬鏁扮洿鍒伴娴嬬背閲嶆弧瓒冲亸宸姹�")
+    
+    # 杩唬璋冩暣鍙傛暟璁剧疆
+    max_iterations = 5
+    tolerance = 0.5
+    
+    if use_iterative_adjustment:
+        st.write("### 杩唬璋冩暣鍙傛暟璁剧疆")
+        iter_cols = st.columns(2)
+        max_iterations = iter_cols[0].number_input("鏈�澶ц凯浠f鏁�", min_value=1, max_value=20, value=5, step=1)
+        tolerance = iter_cols[1].number_input("鍏佽鍋忓樊鐧惧垎姣�(%)", min_value=0.1, max_value=5.0, value=0.5, step=0.1)
+    
+    if st.button("馃搳 璁$畻璋冭妭寤鸿", key="calculate_adjustment"):
+        # 鍙傛暟楠岃瘉
+        validation_errors = []
+        
+        if standard_weight <= 0:
+            validation_errors.append("鏍囧噯绫抽噸蹇呴』澶т簬0")
+        
+        if upper_limit <= standard_weight:
+            validation_errors.append("绫抽噸涓婇檺蹇呴』澶т簬鏍囧噯绫抽噸")
+        
+        if lower_limit >= standard_weight:
+            validation_errors.append("绫抽噸涓嬮檺蹇呴』灏忎簬鏍囧噯绫抽噸")
+        
+        if current_screw_speed <= 0:
+            validation_errors.append("铻烘潌杞�熷繀椤诲ぇ浜�0")
+        
+        if current_process_speed <= 0:
+            validation_errors.append("娴佺▼涓婚�熷繀椤诲ぇ浜�0")
+        
+        if actual_weight <= 0:
+            validation_errors.append("瀹為檯绫抽噸蹇呴』澶т簬0")
+        
+        if validation_errors:
+            st.error("鍙傛暟杈撳叆閿欒锛�")
+            for error in validation_errors:
+                st.error(f"- {error}")
+        else:
+            with st.spinner("姝e湪璁$畻璋冭妭寤鸿..."):
+                # 鍒濆鍖栧弬鏁拌皟鑺傚缓璁櫒
+                adjustment_advisor = ParameterAdjustmentAdvisor()
+                
+                # 鍑嗗鍒濆鍙傛暟
+                initial_params = {
+                    'real_time_weight': actual_weight,
+                    'standard_weight': standard_weight,
+                    'upper_limit': upper_limit,
+                    'lower_limit': lower_limit,
+                    'current_screw_speed': current_screw_speed,
+                    'current_process_speed': current_process_speed,
+                    'current_screw_temperature': current_screw_temperature,
+                    'current_rear_barrel_temperature': current_rear_barrel_temperature,
+                    'current_front_barrel_temperature': current_front_barrel_temperature,
+                    'current_head_temperature': current_head_temperature,
+                    'current_head_pressure': current_head_pressure
+                }
+                
+                # 鏍规嵁鏄惁鍚敤杩唬璋冩暣鎵ц涓嶅悓閫昏緫
+                if use_iterative_adjustment and 'selected_model' in st.session_state:
+                    # 浣跨敤杩唬璋冩暣
+                    iterative_result = adjustment_advisor.iterative_adjustment(
+                        initial_params=initial_params,
+                        model_info=st.session_state['selected_model'],
+                        max_iterations=max_iterations,
+                        tolerance=tolerance
+                    )
+                    
+                    # 浣跨敤杩唬璋冩暣鐨勬渶缁堢粨鏋�
+                    adjustment_result = iterative_result['final_result']
+                    iteration_history = iterative_result['iteration_history']
+                    converged = iterative_result['converged']
+                    total_iterations = iterative_result['total_iterations']
+                else:
+                    # 姝e父璁$畻璋冩暣寤鸿
+                    adjustment_result = adjustment_advisor.calculate_adjustment(
+                        real_time_weight=actual_weight,
+                        standard_weight=standard_weight,
+                        upper_limit=upper_limit,
+                        lower_limit=lower_limit,
+                        current_screw_speed=current_screw_speed,
+                        current_process_speed=current_process_speed,
+                        current_screw_temperature=current_screw_temperature,
+                        current_rear_barrel_temperature=current_rear_barrel_temperature,
+                        current_front_barrel_temperature=current_front_barrel_temperature,
+                        current_head_temperature=current_head_temperature
+                    )
+                    
+                    # 浣跨敤閫変腑鐨勬ā鍨嬮娴嬭皟鏁村悗鐨勭背閲�
+                    predicted_weight = None
+                    if 'selected_model' in st.session_state:
+                        selected_model_info = st.session_state['selected_model']
+                        predicted_weight = adjustment_advisor.predict_weight(
+                            model_info=selected_model_info,
+                            screw_speed=adjustment_result['new_screw_speed'],
+                            head_pressure=current_head_pressure,
+                            process_speed=adjustment_result['new_process_speed'],
+                            screw_temperature=current_screw_temperature,
+                            rear_barrel_temperature=current_rear_barrel_temperature,
+                            front_barrel_temperature=current_front_barrel_temperature,
+                            head_temperature=current_head_temperature
+                        )
+                        
+                    # 灏嗛娴嬬粨鏋滄坊鍔犲埌璋冩暣缁撴灉涓�
+                    adjustment_result['predicted_weight'] = predicted_weight
+                    
+                    # 鍒濆鍖栬凯浠e巻鍙诧紙濡傛灉鏈娇鐢ㄨ凯浠h皟鏁达級
+                    iteration_history = None
+                    converged = None
+                    total_iterations = None
+                
+                # 淇濆瓨鍒板巻鍙茶褰�
+                history_record = {
+                    'timestamp': datetime.now(),
+                    'model_file': st.session_state.get('selected_model_file', '鏈煡妯″瀷'),
+                    'standard_weight': standard_weight,
+                    'upper_limit': upper_limit,
+                    'lower_limit': lower_limit,
+                    'actual_weight': actual_weight,
+                    'current_screw_speed': current_screw_speed,
+                    'current_process_speed': current_process_speed,
+                    'current_screw_temperature': current_screw_temperature,
+                    'current_rear_barrel_temperature': current_rear_barrel_temperature,
+                    'current_front_barrel_temperature': current_front_barrel_temperature,
+                    'current_head_temperature': current_head_temperature,
+                    'adjustment_result': adjustment_result,
+                    'use_iterative_adjustment': use_iterative_adjustment,
+                    'iteration_history': iteration_history
+                }
+                
+                # 娣诲姞鍒颁細璇濈姸鎬佺殑鍘嗗彶璁板綍
+                if 'adjustment_history' not in st.session_state:
+                    st.session_state['adjustment_history'] = []
+                
+                st.session_state['adjustment_history'].append(history_record)
+                
+                # 闄愬埗鍘嗗彶璁板綍鏁伴噺
+                if len(st.session_state['adjustment_history']) > 100:
+                    st.session_state['adjustment_history'] = st.session_state['adjustment_history'][-100:]
+                
+                # 4. 缁撴灉灞曠ず
+                st.success("璋冭妭寤鸿璁$畻瀹屾垚锛�")
+                
+                st.subheader("馃搵 璋冭妭寤鸿缁撴灉")
+                
+                # 4.1 绫抽噸鐘舵��
+                if adjustment_result['status'] == "姝e父":
+                    st.success(f"绫抽噸鐘舵��: {adjustment_result['status']}")
+                else:
+                    st.warning(f"绫抽噸鐘舵��: {adjustment_result['status']}")
+                
+                # 4.2 鍋忓樊淇℃伅
+                info_cols = st.columns(3)
+                info_cols[0].metric("瀹炴椂绫抽噸", f"{adjustment_result['real_time_weight']:.4f} Kg/m")
+                info_cols[1].metric("鏍囧噯绫抽噸", f"{adjustment_result['standard_weight']:.4f} Kg/m")
+                info_cols[2].metric("鍋忓樊鐧惧垎姣�", f"{adjustment_result['deviation_percentage']:.2f}%")
+                
+                # 4.2.1 妯″瀷棰勬祴缁撴灉
+                if adjustment_result['predicted_weight'] is not None:
+                    st.markdown("### 馃搱 妯″瀷棰勬祴缁撴灉")
+                    pred_cols = st.columns(3)
+                    pred_cols[0].metric("璋冩暣鍚庨娴嬬背閲�", f"{adjustment_result['predicted_weight']:.4f} Kg/m")
+                    
+                    # 璁$畻棰勬祴鍋忓樊
+                    predicted_deviation = adjustment_result['predicted_weight'] - adjustment_result['standard_weight']
+                    predicted_deviation_percent = (predicted_deviation / adjustment_result['standard_weight']) * 100
+                    pred_cols[1].metric("棰勬祴鍋忓樊", f"{predicted_deviation:.4f} Kg/m")
+                    pred_cols[2].metric("棰勬祴鍋忓樊鐧惧垎姣�", f"{predicted_deviation_percent:.2f}%")
+                    
+                    # 鏄剧ず棰勬祴鏁堟灉
+                    if abs(predicted_deviation_percent) < 0.5:
+                        st.success("璋冩暣鍚庣背閲嶉娴嬪�兼帴杩戞爣鍑嗗�硷紝璋冩暣鏁堟灉鑹ソ锛�")
+                    elif abs(predicted_deviation_percent) < 1.0:
+                        st.info("璋冩暣鍚庣背閲嶉娴嬪�煎湪鍙帴鍙楄寖鍥村唴銆�")
+                    else:
+                        st.warning("璋冩暣鍚庣背閲嶉娴嬪�间粛鏈夎緝澶у亸宸紝寤鸿杩涗竴姝ュ井璋冦��")
+                else:
+                    st.warning("妯″瀷棰勬祴澶辫触锛岃妫�鏌ユā鍨嬫枃浠舵垨鍙傛暟銆�")
+                
+                # 4.3 鍏抽敭璋冩暣寤鸿
+                st.markdown("### 馃攽 鍏抽敭璋冩暣寤鸿")
+                st.info(adjustment_result['recommendation'])
+                
+                # 4.4 鍙傛暟璋冩暣瀵规瘮
+                st.markdown("### 馃搳 鍙傛暟璋冩暣瀵规瘮")
+                
+                param_compare_df = pd.DataFrame({
+                    '鍙傛暟鍚嶇О': ['铻烘潌杞��', '娴佺▼涓婚��'],
+                    '褰撳墠鍊�': [adjustment_result['current_screw_speed'], adjustment_result['current_process_speed']],
+                    '寤鸿鍊�': [adjustment_result['new_screw_speed'], adjustment_result['new_process_speed']],
+                    '璋冩暣骞呭害': [f"{adjustment_result['screw_speed_adjust_percent']:.2f}%", 
+                               f"{adjustment_result['process_speed_adjust_percent']:.2f}%"]
+                })
+                
+                # 楂樹寒鏄剧ず璋冩暣骞呭害
+                def highlight_adjustment(val):
+                    if isinstance(val, str) and '%' in val:
+                        try:
+                            percent = float(val.strip('%'))
+                            if percent > 0:
+                                return 'background-color: #90EE90'  # 缁胯壊琛ㄧず澧炲姞
+                            elif percent < 0:
+                                return 'background-color: #FFB6C1'  # 绾㈣壊琛ㄧず鍑忓皯
+                        except:
+                            pass
+                    return ''
+                
+                styled_df = param_compare_df.style.applymap(highlight_adjustment, subset=['璋冩暣骞呭害'])
+                st.dataframe(styled_df, use_container_width=True, hide_index=True)
+                
+                # 4.5 鍙鍖栧姣�
+                fig = go.Figure()
+                fig.add_trace(go.Bar(
+                    x=param_compare_df['鍙傛暟鍚嶇О'],
+                    y=param_compare_df['褰撳墠鍊�'],
+                    name='褰撳墠鍊�',
+                    marker_color='blue'
+                ))
+                fig.add_trace(go.Bar(
+                    x=param_compare_df['鍙傛暟鍚嶇О'],
+                    y=param_compare_df['寤鸿鍊�'],
+                    name='寤鸿鍊�',
+                    marker_color='green'
+                ))
+                
+                fig.update_layout(
+                    barmode='group',
+                    title='鍙傛暟璋冩暣瀵规瘮',
+                    yaxis_title='鏁板��',
+                    height=400
+                )
+                
+                st.plotly_chart(fig, use_container_width=True)
+                
+                # 4.6 杩唬璋冩暣缁撴灉灞曠ず
+                if use_iterative_adjustment and iteration_history:
+                    st.markdown("### 馃攧 杩唬璋冩暣鍘嗗彶")
+                    
+                    # 鏄剧ず杩唬璋冩暣鐘舵��
+                    if converged:
+                        st.success(f"鉁� 杩唬璋冩暣鎴愬姛鏀舵暃锛佺粡杩� {total_iterations} 娆¤凯浠o紝棰勬祴绫抽噸鍋忓樊杈惧埌 {tolerance}% 浠ュ唴銆�")
+                    else:
+                        st.warning(f"鈿狅笍 杩唬璋冩暣鏈敹鏁涳紒缁忚繃 {total_iterations} 娆¤凯浠o紝棰勬祴绫抽噸鍋忓樊浠嶆湭杈惧埌 {tolerance}% 浠ュ唴銆�")
+                    
+                    # 鏄剧ず杩唬鍘嗗彶琛ㄦ牸
+                    iter_history_df = pd.DataFrame(iteration_history)
+                    iter_history_df = iter_history_df[[
+                        'iteration', 'current_screw_speed', 'current_process_speed',
+                        'adjusted_screw_speed', 'adjusted_process_speed',
+                        'predicted_weight', 'predicted_deviation_percent'
+                    ]]
+                    
+                    # 鏍煎紡鍖栬〃鏍�
+                    iter_history_df = iter_history_df.rename(columns={
+                        'iteration': '杩唬娆℃暟',
+                        'current_screw_speed': '璋冩暣鍓嶈灪鏉嗚浆閫�',
+                        'current_process_speed': '璋冩暣鍓嶆祦绋嬩富閫�',
+                        'adjusted_screw_speed': '璋冩暣鍚庤灪鏉嗚浆閫�',
+                        'adjusted_process_speed': '璋冩暣鍚庢祦绋嬩富閫�',
+                        'predicted_weight': '棰勬祴绫抽噸',
+                        'predicted_deviation_percent': '棰勬祴鍋忓樊鐧惧垎姣�(%)'
+                    })
+                    
+                    st.dataframe(iter_history_df, use_container_width=True)
+                    
+                    # 杩唬璋冩暣鍙鍖�
+                    st.markdown("### 馃搲 杩唬璋冩暣鏁堟灉")
+                    
+                    # 鍋忓樊鍙樺寲瓒嬪娍鍥�
+                    fig_deviation = go.Figure()
+                    fig_deviation.add_trace(go.Scatter(
+                        x=iter_history_df['杩唬娆℃暟'],
+                        y=iter_history_df['棰勬祴鍋忓樊鐧惧垎姣�(%)'],
+                        mode='lines+markers',
+                        name='棰勬祴鍋忓樊鐧惧垎姣�',
+                        line=dict(color='blue', width=2),
+                        marker=dict(size=8)
+                    ))
+                    
+                    # 娣诲姞鍋忓樊闃堝�肩嚎
+                    fig_deviation.add_trace(go.Scatter(
+                        x=iter_history_df['杩唬娆℃暟'],
+                        y=[tolerance] * len(iter_history_df),
+                        mode='lines',
+                        name='鍏佽鍋忓樊涓婇檺',
+                        line=dict(color='red', dash='dash', width=1)
+                    ))
+                    
+                    fig_deviation.add_trace(go.Scatter(
+                        x=iter_history_df['杩唬娆℃暟'],
+                        y=[-tolerance] * len(iter_history_df),
+                        mode='lines',
+                        name='鍏佽鍋忓樊涓嬮檺',
+                        line=dict(color='red', dash='dash', width=1)
+                    ))
+                    
+                    fig_deviation.update_layout(
+                        title='杩唬璋冩暣鍋忓樊鍙樺寲瓒嬪娍',
+                        xaxis_title='杩唬娆℃暟',
+                        yaxis_title='棰勬祴鍋忓樊鐧惧垎姣�(%)',
+                        height=400,
+                        legend=dict(yanchor="top", y=0.99, xanchor="left", x=0.01)
+                    )
+                    
+                    st.plotly_chart(fig_deviation, use_container_width=True)
+                    
+                    # 铻烘潌杞�熷拰娴佺▼涓婚�熷彉鍖栬秼鍔�
+                    fig_params = go.Figure()
+                    fig_params.add_trace(go.Scatter(
+                        x=iter_history_df['杩唬娆℃暟'],
+                        y=iter_history_df['璋冩暣鍓嶈灪鏉嗚浆閫�'],
+                        mode='lines+markers',
+                        name='璋冩暣鍓嶈灪鏉嗚浆閫�',
+                        line=dict(color='blue', width=2),
+                        marker=dict(size=8)
+                    ))
+                    
+                    fig_params.add_trace(go.Scatter(
+                        x=iter_history_df['杩唬娆℃暟'],
+                        y=iter_history_df['璋冩暣鍚庤灪鏉嗚浆閫�'],
+                        mode='lines+markers',
+                        name='璋冩暣鍚庤灪鏉嗚浆閫�',
+                        line=dict(color='green', width=2),
+                        marker=dict(size=8)
+                    ))
+                    
+                    fig_params.add_trace(go.Scatter(
+                        x=iter_history_df['杩唬娆℃暟'],
+                        y=iter_history_df['璋冩暣鍓嶆祦绋嬩富閫�'],
+                        mode='lines+markers',
+                        name='璋冩暣鍓嶆祦绋嬩富閫�',
+                        line=dict(color='orange', width=2),
+                        marker=dict(size=8)
+                    ))
+                    
+                    fig_params.add_trace(go.Scatter(
+                        x=iter_history_df['杩唬娆℃暟'],
+                        y=iter_history_df['璋冩暣鍚庢祦绋嬩富閫�'],
+                        mode='lines+markers',
+                        name='璋冩暣鍚庢祦绋嬩富閫�',
+                        line=dict(color='purple', width=2),
+                        marker=dict(size=8)
+                    ))
+                    
+                    fig_params.update_layout(
+                        title='鍙傛暟璋冩暣鍙樺寲瓒嬪娍',
+                        xaxis_title='杩唬娆℃暟',
+                        yaxis_title='鏁板��',
+                        height=400,
+                        legend=dict(yanchor="top", y=0.99, xanchor="right", x=0.99)
+                    )
+                    
+                    st.plotly_chart(fig_params, use_container_width=True)
+    
+    # 5. 鍘嗗彶璁板綍灞曠ず
+    st.subheader("馃摎 鍘嗗彶璋冭妭璁板綍")
+    
+    if 'adjustment_history' in st.session_state and st.session_state['adjustment_history']:
+        # 鏄剧ず鍘嗗彶璁板綍鏁伴噺
+        st.write(f"鍏� {len(st.session_state['adjustment_history'])} 鏉″巻鍙茶褰�")
+        
+        # 鍒嗛〉鏄剧ず
+        page_size = 10
+        total_pages = (len(st.session_state['adjustment_history']) + page_size - 1) // page_size
+        
+        page = st.selectbox(
+            "閫夋嫨椤电爜",
+            options=range(1, total_pages + 1),
+            key="history_page"
+        )
+        
+        start_idx = (page - 1) * page_size
+        end_idx = start_idx + page_size
+        paginated_history = st.session_state['adjustment_history'][start_idx:end_idx]
+        
+        # 鍙嶅悜鏄剧ず锛屾渶鏂拌褰曞湪鍓嶉潰
+        for record in reversed(paginated_history):
+            with st.expander(f"璁板綍鏃堕棿: {record['timestamp'].strftime('%Y-%m-%d %H:%M:%S')} | 妯″瀷: {record['model_file']}"):
+                history_cols = st.columns(3)
+                
+                with history_cols[0]:
+                    st.write("**绫抽噸鍙傛暟**")
+                    st.write(f"- 鏍囧噯绫抽噸: {record['standard_weight']:.4f} Kg/m")
+                    st.write(f"- 绫抽噸涓婇檺: {record['upper_limit']:.4f} Kg/m")
+                    st.write(f"- 绫抽噸涓嬮檺: {record['lower_limit']:.4f} Kg/m")
+                    st.write(f"- 瀹為檯绫抽噸: {record['actual_weight']:.4f} Kg/m")
+                
+                with history_cols[1]:
+                    st.write("**閫熷害鍙傛暟**")
+                    st.write(f"- 铻烘潌杞��: {record['current_screw_speed']:.1f} rpm")
+                    st.write(f"- 娴佺▼涓婚��: {record['current_process_speed']:.1f} m/min")
+                
+                with history_cols[2]:
+                    st.write("**娓╁害鍙傛暟**")
+                    st.write(f"- 铻烘潌娓╁害: {record['current_screw_temperature']:.1f} 掳C")
+                    st.write(f"- 鍚庢満绛掓俯搴�: {record['current_rear_barrel_temperature']:.1f} 掳C")
+                    st.write(f"- 鍓嶆満绛掓俯搴�: {record['current_front_barrel_temperature']:.1f} 掳C")
+                    st.write(f"- 鏈哄ご娓╁害: {record['current_head_temperature']:.1f} 掳C")
+                
+                st.write("**璋冩暣寤鸿**")
+                st.write(record['adjustment_result']['recommendation'])
+    else:
+        st.info("鏆傛棤鍘嗗彶璋冭妭璁板綍")
+    
+    # 6. 甯姪璇存槑
+    with st.expander("鉂� 甯姪璇存槑"):
+        st.markdown("""
+        ### 鍔熻兘璇存槑
+        鏈姛鑳芥ā鍧楃敤浜庢牴鎹綋鍓嶇背閲嶆祴閲忓�煎拰鎸ゅ嚭鏈哄弬鏁帮紝涓虹敤鎴锋彁渚涚瀛﹀悎鐞嗙殑鍙傛暟璋冩暣寤鸿锛屼互甯姪鐢ㄦ埛灏嗙背閲嶆帶鍒跺湪鏍囧噯鑼冨洿鍐呫��
+        
+        ### 妯″瀷閫夋嫨
+        - 绯荤粺浼氳嚜鍔ㄨ鍙栭」鐩洰褰曚腑璁粌濂界殑妯″瀷鏂囦欢
+        - 妯″瀷鏂囦欢闇�绗﹀悎绯荤粺瑕佹眰鐨勬牸寮忥紝鍖呭惈妯″瀷鍙傛暟鍜岃缁冧俊鎭�
+        - 寤鸿閫夋嫨R虏寰楀垎杈冮珮銆佽宸緝灏忕殑妯″瀷
+        
+        ### 鍙傛暟杈撳叆
+        - 绫抽噸鏍囧噯鍊硷細鎮ㄦ湡鏈涚殑鐩爣绫抽噸鍊�
+        - 绫抽噸涓婁笅闄愶細鍏佽鐨勭背閲嶆尝鍔ㄨ寖鍥�
+        - 鎸ゅ嚭鏈哄綋鍓嶅弬鏁帮細鍖呮嫭铻烘潌杞�熴�佹祦绋嬩富閫熴�佹満澶村帇鍔涘拰鎸ゅ嚭鏈虹數娴�
+        - 褰撳墠瀹為檯绫抽噸锛氬疄闄呮祴閲忓緱鍒扮殑绫抽噸鍊�
+        
+        ### 缁撴灉瑙h
+        - 绫抽噸鐘舵�侊細鏄剧ず褰撳墠绫抽噸鏄惁鍦ㄥ厑璁歌寖鍥村唴
+        - 鍋忓樊鐧惧垎姣旓細褰撳墠绫抽噸涓庢爣鍑嗙背閲嶇殑鍋忓樊鐧惧垎姣�
+        - 鍏抽敭璋冩暣寤鸿锛氱郴缁熺粰鍑虹殑涓昏璋冩暣寤鸿
+        - 鍙傛暟璋冩暣瀵规瘮锛氳缁嗗睍绀烘瘡涓弬鏁扮殑褰撳墠鍊笺�佸缓璁�煎拰璋冩暣骞呭害
+        
+        ### 娉ㄦ剰浜嬮」
+        1. 璇风‘淇濊緭鍏ョ殑鍙傛暟鍊煎噯纭弽鏄犺澶囧綋鍓嶇姸鎬�
+        2. 璋冩暣寤鸿浠呬緵鍙傝�冿紝瀹為檯鎿嶄綔鏃惰缁撳悎鐜板満缁忛獙
+        3. 寤鸿鍦ㄨ皟鏁村弬鏁板悗瀵嗗垏瑙傚療绫抽噸鍙樺寲
+        4. 瀹氭湡鏇存柊妯″瀷浠ユ彁楂樺缓璁殑鍑嗙‘鎬�
+        """)
+
+# 椤甸潰鍏ュ彛
+if __name__ == "__main__":
+    show_extruder_parameter_adjustment()

--
Gitblit v1.9.3