From 9af648f305989b457ff4bbbba62716ee984820ea Mon Sep 17 00:00:00 2001 From: mcbloch Date: Thu, 7 Dec 2023 04:52:52 +0100 Subject: [PATCH] statsssss --- src/main.v | 134 ++++++++++++++++++++++++-- src/templates/home.html | 203 +++++++++++++++++++++++++++++++--------- 2 files changed, 285 insertions(+), 52 deletions(-) diff --git a/src/main.v b/src/main.v index 88daa29..b6e34b7 100644 --- a/src/main.v +++ b/src/main.v @@ -4,6 +4,9 @@ import vweb import db.sqlite import time import net.http +import arrays +import maps +import math.stats const http_port = 8080 @@ -24,15 +27,16 @@ pub fn (s Status) str() string { } struct Person { - id int @[primary; sql: serial] - status int - name string - remark string - order_time time.Time + id int @[primary; sql: serial] + status int + name string + remark string + order_time time.Time + delivery_time time.Time } pub fn (p Person) str() string { - return 'Person[id:${p.id}, status:${p.status}]' + return 'Person[id:${p.id}, name: ${p.name}, status:${p.status}, time:${p.order_time}, end:${p.delivery_time}]' } pub fn (p Person) order_time_humanized() string { @@ -69,6 +73,83 @@ fn get_people() ![]Person { return people } +fn get_finished_count() !int { + mut db := create_db_connection()! + people := sql db { + select from Person where status == 3 + }! + return people.len +} + +struct PerHour { + t time.Time + label string + amount int + percentage int + color string +} + +fn get_all() ![]Person { + mut db := create_db_connection()! + return sql db { + select from Person order by id desc + }! +} + +fn get_last_delivered() ![]Person { + mut db := create_db_connection()! + return sql db { + select from Person order by delivery_time desc limit 1 + }! +} + +fn get_finished_per_hour() ![]PerHour { + mut db := create_db_connection()! + people := sql db { + select from Person where status == 3 + }! + + grouped := arrays.group_by(people, fn (p Person) string { + return '${p.order_time.hour}:${int(p.order_time.minute / 30) * 30} ${p.order_time.day}/${p.order_time.month}' + }) + + max_per_hour := arrays.max(grouped.values().map(it.len)) or { 1 } + 10 + + mut grouped_arr := maps.to_array(grouped, fn [max_per_hour] (k string, v []Person) PerHour { + return PerHour{ + t: v[0].order_time + label: k + amount: v.len + percentage: int(v.len * 100 / max_per_hour) + color: (if v[0].order_time.hour % 2 == 0 { 'green' } else { 'red' }) + } + }) + grouped_arr.sort(a.t < b.t) + return grouped_arr +} + +fn get_ppu() !f64 { + mut db := create_db_connection()! + mut people := sql db { + select from Person where status == 3 + }! + people.sort(a.order_time < b.order_time) + + time_range := people.last().order_time - people.first().order_time + return people.len / time_range.hours() +} + +fn get_mean_time_between_pannenkoeken() !time.Duration { + mut db := create_db_connection()! + time_zero := time.Time{ + unix: 0 + } + mut people := sql db { + select from Person where (status == 3 && delivery_time > time_zero) order by delivery_time desc limit 10 + }! + return stats.mean(arrays.window(people, size: 2).map(it[0].delivery_time - it[1].delivery_time)) +} + fn status_update(user_id int) !Person { mut db := create_db_connection()! people := sql db { @@ -78,6 +159,11 @@ fn status_update(user_id int) !Person { sql db { update Person set status = person.status + 1 where id == person.id }! + if person.status == 2 { + sql db { + update Person set delivery_time = time.now() where id == person.id + }! + } return person } @@ -111,7 +197,7 @@ pub fn (app App) before_request() { } fn main() { - println('Start pannenkoeken webserver') + println('Start 🥞 webserver') mut db := create_db_connection() or { panic(err) } sql db { @@ -129,6 +215,40 @@ pub fn (mut app App) home() vweb.Result { app.set_status(400, '') return app.text('${err}') } + person_finished_count := get_finished_count() or { + app.set_status(400, '') + return app.text('${err}') + } + finished_per_hour := get_finished_per_hour() or { + app.set_status(400, '') + return app.text('${err}') + } + // pannenkoek per uur + ppu := get_ppu() or { + app.set_status(400, '') + return app.text('${err}') + } + all_people := get_all() or { + app.set_status(400, '') + return app.text('${err}') + } + mean_time := get_mean_time_between_pannenkoeken() or { + app.set_status(400, '') + return app.text('${err}') + } + mut last_delivered := get_last_delivered() or { + app.set_status(400, '') + return app.text('${err}') + } + if last_delivered.len == 0 { + last_delivered << Person{ + delivery_time: time.now() + } + } + // Time to pannenkoek + time_since_last := (time.now() - last_delivered.first().delivery_time) + ttp := time.unix(i64(mean_time.seconds() - time_since_last.seconds())) - time.unix(0) + return $vweb.html() } diff --git a/src/templates/home.html b/src/templates/home.html index cb1aa9c..ab5ac1f 100644 --- a/src/templates/home.html +++ b/src/templates/home.html @@ -1,10 +1,11 @@ + - + - Pannenkoekenwachtrij - + 🥞wachtrij + + -
+
-
+
- Welkom bij de pannenkoekenwachtrij -
+ Welkom bij de 🥞wachtrij + +
+
+
+
+
+ Er zijn al @person_finished_count 🥞 afgeleverd! +
+ Dat is @{ppu:.2} 🥞/uur +
+ Gemiddelde tijd tussen 🥞: @{mean_time.str()} +
+ + TTP: + @if ttp < 0 + Soonâ„¢ + @else + @ttp + @end + + +
@@ -47,18 +99,21 @@
Naam van de volgende: - +
Specifieke opmerkingen: - +
- +
@@ -73,9 +128,10 @@
- +
-
+
@@ -84,52 +140,109 @@
-

Zie hieronder de lijst van personen die een pannenkoek willen

+

Zie hieronder de lijst van personen die een 🥞 willen

- + - + @if people.len > 0 - @for person in people[..1] - - - - - - - @end + @for person in people[..1] + + + + + + + @end @end - + @if people.len > 1 - @for person in people[1..] - - - - - - - @end + @for person in people[1..] + + + + + + + @end @end
Volgende persoonVolgende + persoon
@person.name @person.remark()@person.status_str()@person.order_time_humanized() -
- - -
-
@person.name @person.remark()@person.status_str()@person.order_time_humanized() +
+ + +
+
Andere personenAndere personen +
@person.name @person.remark()@person.status_str()@person.order_time_humanized() -
- - -
-
@person.name @person.remark()@person.status_str()@person.order_time_humanized() +
+ + +
+
-
+ +
+
+
+
+
+
+
+

Aantal bestelde 🥞

+
+
+ @for ph in finished_per_hour +
+ @ph.amount
+ @end +
+ +
+ @for ph in finished_per_hour +
@ph.label
+ @end +
+
+
+ + - + + \ No newline at end of file