Repository navigation
Expand file tree
/
Copy pathapp.py
More file actions
180 lines (153 loc) · 5.24 KB
/
Copy pathapp.py
File metadata and controls
180 lines (153 loc) · 5.24 KB
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
from datetime import datetime
from flask import Flask, render_template, request
import pandas as pd
import plotly.express as px
import sqlite3
app = Flask(__name__)
def get_data(
start_date=None, end_date=None, turno=None, modelo=None, exclude_duplicates=False
):
conn = sqlite3.connect(
r"INSIRA O CAMINHO DO BANCO AQUI."
)
if not start_date:
start_date = datetime.now().strftime("%Y-%m-%d")
if not end_date:
end_date = start_date
params = [start_date, end_date]
extra_conditions = []
if turno:
extra_conditions.append("turno = ?")
params.append(turno)
if modelo:
extra_conditions.append("modelo = ?")
params.append(modelo)
where_conditions = " AND ".join(extra_conditions)
distinct_clause = "DISTINCT" if exclude_duplicates else ""
case_clause = (
f"CASE WHEN serial LIKE 'SN%' THEN serial ELSE {distinct_clause} serial END"
)
query = f"""
SELECT linha_solicitante, COUNT({case_clause}) AS quantidade
FROM lavagem_placas
WHERE data BETWEEN ? AND ? {f'AND {where_conditions}' if where_conditions else ''}
GROUP BY linha_solicitante
ORDER BY quantidade DESC
"""
df = pd.read_sql_query(query, conn, params=params)
conn.close()
return df
def create_figure(df, title):
fig = px.bar(
df,
x="linha_solicitante",
y="quantidade",
color="quantidade",
labels={
"linha_solicitante": "Linhas SMT",
"quantidade": "Quantidade",
}, # Altere aqui
title=title,
color_continuous_scale=px.colors.sequential.Viridis,
)
fig.update_layout(
autosize=False,
width=2300,
height=660,
title_x=0.5,
title_font_size=25,
showlegend=False,
xaxis=dict(
title="Linhas SMT", title_font=dict(size=20), tickfont=dict(size=18)
),
yaxis=dict( # Adicione este bloco
title="Quantidade",
title_font=dict(size=14),
tickfont=dict(size=18),
),
)
fig.update_traces(
texttemplate="%{y}", textposition="outside", textfont=dict(size=18)
)
return fig.to_html()
def get_turnos():
conn = sqlite3.connect(
r"INSIRA O CAMINHO DO BANCO AQUI."
)
turnos = pd.read_sql_query("SELECT DISTINCT turno FROM lavagem_placas", conn)
conn.close()
return turnos["turno"].tolist()
def get_modelos():
conn = sqlite3.connect(
r"INSIRA O CAMINHO DO BANCO AQUI."
)
modelos = pd.read_sql_query("SELECT DISTINCT modelo FROM lavagem_placas", conn)
conn.close()
return modelos["modelo"].tolist()
@app.route("/", methods=["GET", "POST"])
def dashboard():
# Inicializa variáveis
selected_date = request.form.get("date-filter")
start_date = request.form.get("start-date")
end_date = request.form.get("end-date")
turno = request.form.get("turno")
modelo = request.form.get("modelo")
action = request.form.get("action", "single-date")
exclude_duplicates = "exclude_duplicates" in request.form
# Determina as datas formatadas
formatted_date = (
datetime.now().strftime("%d/%m/%Y")
if not selected_date
else datetime.strptime(selected_date, "%Y-%m-%d").strftime("%d/%m/%Y")
)
formatted_start_date = (
formatted_date
if not start_date
else datetime.strptime(start_date, "%Y-%m-%d").strftime("%d/%m/%Y")
)
formatted_end_date = (
formatted_date
if not end_date
else datetime.strptime(end_date, "%Y-%m-%d").strftime("%d/%m/%Y")
)
# Obtém os dados baseados na seleção do usuário
df = get_data(
formatted_start_date, formatted_end_date, turno, modelo, exclude_duplicates
)
# Atualiza o título com base nas seleções do usuário
title_parts = ["Quantidade de Seriais"]
if turno:
title_parts.append(f"do {turno} Turno")
if modelo:
title_parts.append(f"do Modelo {modelo}")
if action == "single-date":
title_parts.append(f"da Data {formatted_date}")
elif action == "date-range":
title_parts.append(
f"Entre os Dias {formatted_start_date} e {formatted_end_date}"
)
if exclude_duplicates:
title_parts.append("(Duplicatas Excluídas)")
title = " ".join(title_parts)
# Prepara o HTML do gráfico
graph_html = create_figure(df, title)
current_date = datetime.now().strftime("%Y-%m-%d")
# Obtém os dados para os filtros de turno e modelo
turnos = get_turnos()
modelos = get_modelos()
# Renderiza o template HTML passando as variáveis necessárias
return render_template(
"dashboard.html",
graph_html=graph_html,
current_date=current_date,
turnos=turnos,
modelos=modelos,
selected_date=selected_date,
start_date=start_date,
end_date=end_date,
turno_selecionado=turno,
modelo_selecionado=modelo,
exclude_duplicates=exclude_duplicates,
)
if __name__ == "__main__":
app.run(debug=True)