baoshiwei
2026-03-13 6628f663b636675bcaea316f2deaddf337de480e
app/pages/comprehensive_dashboard.py
@@ -14,7 +14,7 @@
    main_process_service = MainProcessService()
    # 页面标题
    st.title("多维综合分析")
    st.title("条重综合分析")
    # 初始化会话状态用于日期同步
    if 'comp_start_date' not in st.session_state:
@@ -23,6 +23,8 @@
        st.session_state['comp_end_date'] = datetime.now().date()
    if 'comp_quick_select' not in st.session_state:
        st.session_state['comp_quick_select'] = "最近7天"
    if 'time_offset' not in st.session_state:
        st.session_state['time_offset'] = 0
    # 定义回调函数
    def update_dates(qs):
@@ -93,8 +95,22 @@
                on_change=on_date_change
            )
        with cols[7]:
            query_button = st.button("🚀 查询", key="comp_query", width='stretch')
        # 在第二行添加时间偏移配置
        st.markdown("---")
        offset_cols = st.columns([2, 4, 2])
        with offset_cols[0]:
            st.write("⏱️ **生产对齐配置**")
        with offset_cols[1]:
            time_offset = st.slider(
                "挤出/主流程数据向后偏移 (分钟)",
                min_value=0,
                max_value=60,
                value=st.session_state['time_offset'],
                help="由于胎面从挤出到分拣需要时间,将上游数据向后移动,使其与分拣磅秤上的重量数据在时间轴上对齐。"
            )
            st.session_state['time_offset'] = time_offset
        with offset_cols[2]:
            query_button = st.button("🚀 开始分析", key="comp_query", width='stretch')
    # 转换为datetime对象
    start_dt = datetime.combine(start_date, datetime.min.time())
@@ -103,20 +119,32 @@
    # 查询处理
    if query_button:
        with st.spinner("正在聚合多源数据..."):
            # 1. 获取分拣磅秤数据
            # 获取偏移量
            offset_delta = timedelta(minutes=st.session_state['time_offset'])
            # 1. 获取分拣磅秤数据 (作为基准,不偏移)
            df_sorting = sorting_service.get_sorting_scale_data(start_dt, end_dt)
            # 2. 获取挤出机数据
            # 2. 获取挤出机数据 (应用偏移)
            df_extruder = extruder_service.get_extruder_data(start_dt, end_dt)
            # 3. 获取主流程控制数据
            if df_extruder is not None and not df_extruder.empty:
                df_extruder['time'] = df_extruder['time'] + offset_delta
            # 3. 获取主流程控制数据 (应用偏移)
            df_main_speed = main_process_service.get_cutting_setting_data(start_dt, end_dt)
            if df_main_speed is not None and not df_main_speed.empty:
                df_main_speed['time'] = df_main_speed['time'] + offset_delta
            df_temp = main_process_service.get_temperature_control_data(start_dt, end_dt)
            if df_temp is not None and not df_temp.empty:
                df_temp['time'] = df_temp['time'] + offset_delta
            # 检查是否有数据
            has_data = any([
                df_sorting is not None and not df_sorting.empty,
                df_extruder is not None and not df_extruder.empty,
                df_main_speed is not None and not df_main_speed.empty,
                df_temp is not None and not df_temp.empty
                df_temp is not None and not df_temp.empty
            ])
            if not has_data:
@@ -207,14 +235,14 @@
            # 添加挤出机米重
            if df_extruder is not None and not df_extruder.empty:
                fig.add_trace(go.Scatter(
                    x=df_extruder['time'],
                    y=df_extruder['metered_weight'],
                    name='挤出机米重 (g/m)',
                    mode='lines',
                    line=dict(color='green', width=1.5),
                    yaxis='y2'
                ))
                # fig.add_trace(go.Scatter(
                #     x=df_extruder['time'],
                #     y=df_extruder['metered_weight'],
                #     name='挤出机米重 (Kg/m)',
                #     mode='lines',
                #     line=dict(color='green', width=1.5),
                #     yaxis='y2'
                # ))
                # 添加挤出机实际转速
                fig.add_trace(go.Scatter(
                    x=df_extruder['time'], 
@@ -235,14 +263,26 @@
                    line=dict(color='red', width=1.5),
                    yaxis='y3' # 共用速度轴
                ))
                # 添加裁切计数
                if 'cutting_count' in df_main_speed.columns:
                    fig.add_trace(go.Scatter(
                        x=df_main_speed['time'],
                        y=df_main_speed['cutting_count'],
                        name='裁切计数',
                        mode='lines',
                        line=dict(color='purple', width=1.5),
                        yaxis='y5'
                    ))
            # 添加温度设定值
            if df_temp is not None and not df_temp.empty:
                temp_fields = {
                    'nakata_extruder_screw_set_temp': '螺杆设定 (°C)',
                    'nakata_extruder_rear_barrel_set_temp': '后机筒设定 (°C)',
                    'nakata_extruder_front_barrel_set_temp': '前机筒设定 (°C)',
                    'nakata_extruder_head_set_temp': '机头设定 (°C)'
                    'nakata_extruder_screw_display_temp': '螺杆显示 (°C)',
                    'nakata_extruder_rear_barrel_display_temp': '后机筒显示 (°C)',
                    'nakata_extruder_front_barrel_display_temp': '前机筒显示 (°C)',
                    'nakata_extruder_head_display_temp': '机头显示 (°C)'
                }
                colors = ['#FF4B4B', '#FF8C00', '#FFD700', '#DA70D6']
                for i, (field, label) in enumerate(temp_fields.items()):
@@ -257,7 +297,7 @@
            # 设置多坐标轴布局
            fig.update_layout(
                title='多维综合趋势分析',
                title='条重综合趋势分析',
                xaxis=dict(
                    title='时间',
                    rangeslider=dict(visible=True),
@@ -269,7 +309,7 @@
                    tickfont=dict(color='blue')
                ),
                yaxis2=dict(
                    title='米重 (g/m)',
                    title='米重 (Kg/m)',
                    title_font=dict(color='green'),
                    tickfont=dict(color='green'),
                    overlaying='y',
@@ -293,6 +333,15 @@
                    anchor='free',
                    position=0.15
                ),
                yaxis5=dict(
                    title='裁切计数',
                    title_font=dict(color='purple'),
                    tickfont=dict(color='purple'),
                    overlaying='y',
                    side='right',
                    anchor='free',
                    position=0.7
                ),
                legend=dict(
                    orientation="h",
                    yanchor="bottom",
@@ -309,21 +358,21 @@
            st.plotly_chart(fig, width='stretch', config={'scrollZoom': True})
            
            # 数据摘要
            st.subheader("📊 数据摘要")
            summary_cols = st.columns(4)
            # st.subheader("📊 数据摘要")
            # summary_cols = st.columns(4)
            
            with summary_cols[0]:
                if df_sorting is not None and not df_sorting.empty:
                    st.metric("平均重量", f"{df_sorting['weight'].mean():.2f} kg")
            # with summary_cols[0]:
            #     if df_sorting is not None and not df_sorting.empty:
            #         st.metric("平均重量", f"{df_sorting['weight'].mean():.2f} kg")
            
            with summary_cols[1]:
                if df_extruder is not None and not df_extruder.empty:
                    st.metric("平均米重", f"{df_extruder['metered_weight'].mean():.2f} g/m")
            # with summary_cols[1]:
            #     if df_extruder is not None and not df_extruder.empty:
            #         st.metric("平均米重", f"{df_extruder['metered_weight'].mean():.2f} Kg/m")
            
            with summary_cols[2]:
                if df_main_speed is not None and not df_main_speed.empty:
                    st.metric("平均主速", f"{df_main_speed['process_main_speed'].mean():.2f} M/Min")
            # with summary_cols[2]:
            #     if df_main_speed is not None and not df_main_speed.empty:
            #         st.metric("平均主速", f"{df_main_speed['process_main_speed'].mean():.2f} M/Min")
            
            with summary_cols[3]:
                if df_temp is not None and not df_temp.empty:
                    st.metric("平均螺杆温控", f"{df_temp['nakata_extruder_screw_set_temp'].mean():.1f} °C")
            # with summary_cols[3]:
            #     if df_temp is not None and not df_temp.empty:
            #         st.metric("平均螺杆温控", f"{df_temp['nakata_extruder_screw_set_temp'].mean():.1f} °C")