| | |
| | | main_process_service = MainProcessService() |
| | | |
| | | # 页面标题 |
| | | st.title("多维综合分析") |
| | | st.title("条重综合分析") |
| | | |
| | | # 初始化会话状态用于日期同步 |
| | | if 'comp_start_date' not in st.session_state: |
| | |
| | | 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): |
| | |
| | | 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()) |
| | |
| | | # 查询处理 |
| | | 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: |
| | |
| | | |
| | | # 添加挤出机米重 |
| | | 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'], |
| | |
| | | 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()): |
| | |
| | | |
| | | # 设置多坐标轴布局 |
| | | fig.update_layout( |
| | | title='多维综合趋势分析', |
| | | title='条重综合趋势分析', |
| | | xaxis=dict( |
| | | title='时间', |
| | | rangeslider=dict(visible=True), |
| | |
| | | tickfont=dict(color='blue') |
| | | ), |
| | | yaxis2=dict( |
| | | title='米重 (g/m)', |
| | | title='米重 (Kg/m)', |
| | | title_font=dict(color='green'), |
| | | tickfont=dict(color='green'), |
| | | overlaying='y', |
| | |
| | | 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", |
| | |
| | | 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") |