Stats
This commit is contained in:
parent
e20fc07053
commit
9bb977dedb
@ -249,7 +249,6 @@ namespace Matomat
|
||||
"²²²²²²²²²²²²²²²²²²²²²²²²²²²²" + p[0] +
|
||||
"² MATOMAT Wilkommen! ²" + p[1] +
|
||||
"² Frohes genießen der Mate ²" + p[2]);
|
||||
Factory.getLCD().print("µ_¶·-¸¹ºµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ");
|
||||
}
|
||||
|
||||
public static void showUserInfo(User user)
|
||||
@ -303,6 +302,41 @@ namespace Matomat
|
||||
|
||||
public static void InsShowStats(User user, bool lastMonth = true)
|
||||
{
|
||||
List<Product> products = History.GetDrunkProducts(user, lastMonth);
|
||||
foreach (Product item in products)
|
||||
{
|
||||
string output="";
|
||||
if (lastMonth)
|
||||
{
|
||||
output += " Dein Verbrauch im letzten Monat an ";
|
||||
}
|
||||
else
|
||||
{
|
||||
output += " Dein Verbrauch seit Anbeginn der Zeit ";
|
||||
}
|
||||
output += Factory.getLCD().CenterString("\""+item.GetName()+"\"");
|
||||
Tuple<int, double> sum = History.GetDrunkProductsSum(user, item, lastMonth);
|
||||
output += Factory.getLCD().CenterString(sum.Item1 + " Flaschen mit " + sum.Item2.ToString("N2") + " g Koffein");
|
||||
output += " Verlauf: ";
|
||||
List<int> chart = History.GetDrunkProductsChart(user, item, lastMonth);
|
||||
foreach (int value in chart)
|
||||
{
|
||||
switch (value)
|
||||
{
|
||||
case 0: output += "µ"; break;
|
||||
case 1: output += "_"; break;
|
||||
case 2: output += "¶"; break;
|
||||
case 3: output += "·"; break;
|
||||
case 4: output += "-"; break;
|
||||
case 5: output += "¸"; break;
|
||||
case 6: output += "¹"; break;
|
||||
case 7: output += "º"; break;
|
||||
default: output += " "; break;
|
||||
}
|
||||
}
|
||||
Factory.getLCD().print(output, 5);
|
||||
System.Threading.Thread.Sleep(4500);
|
||||
}
|
||||
/** Alle Daten aus der DB Holen die aus dem zeitraum für den user da sind zu Produkt X
|
||||
* Lege liste mit 40 plätzen an
|
||||
* Teile Zeit auf die 40 Plätze auf, älteste bewegung = t0, neueste bewegung = t40
|
||||
@ -311,6 +345,16 @@ namespace Matomat
|
||||
* Rechne die prozentuale getränke pro platz
|
||||
* erstelle en Graphen
|
||||
*/
|
||||
|
||||
/*1234567890123456789012345678901234567890
|
||||
* Verlauf: -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
* Dein Verbrauch seit Anbeginn der Zeit
|
||||
* Dein Verbrauch im letzten Monat an
|
||||
* "Club-Mate"
|
||||
* 1221 Flaschen mit 101,22 g Koffein
|
||||
*_-----___--__-_--_----_----_-------___--
|
||||
*
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -90,5 +90,117 @@ namespace Matomat.Model
|
||||
h.bind(k);
|
||||
h.store();
|
||||
}
|
||||
|
||||
public static List<Product> GetDrunkProducts(User u, bool lastMonth)
|
||||
{
|
||||
DBQuery query = Factory.getDBO().getQuery(true);
|
||||
query.select(Factory.getDBO().quoteName("p.barcode", "id"));
|
||||
query.from(Factory.getDBO().quoteName("history", "h"));
|
||||
query.leftJoin(Factory.getDBO().quoteName("product", "p") + " ON " + Factory.getDBO().quoteName("p.id") + " = " + Factory.getDBO().quoteName("h.prod"));
|
||||
query.where(Factory.getDBO().quoteName("h.user") + " = " + Factory.getDBO().quote(u.GetId().ToString()));
|
||||
if (lastMonth)
|
||||
{
|
||||
query.where(Factory.getDBO().quoteName("h.time") + " >= DATE_SUB(NOW(),INTERVAL 30 DAY)");
|
||||
}
|
||||
query.group(Factory.getDBO().quoteName("h.prod"));
|
||||
|
||||
Factory.getDBO().setQuery(query);
|
||||
|
||||
List<object[]> rows = Factory.getDBO().getResultList();
|
||||
List<Product> ret = new List<Product>();
|
||||
if (rows == null)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
foreach (object[] row in rows)
|
||||
{
|
||||
ret.Add(new Product((long)row[0]));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static Tuple<int, double> GetDrunkProductsSum(User u, Product item, bool lastMonth)
|
||||
{
|
||||
DBQuery query = Factory.getDBO().getQuery(true);
|
||||
query.select("COUNT(*) AS " + Factory.getDBO().quoteName("boddles"));
|
||||
query.select("SUM(" + Factory.getDBO().quoteName("p.caffeine") + ") AS " + Factory.getDBO().quoteName("caffeine"));
|
||||
query.from(Factory.getDBO().quoteName("history", "h"));
|
||||
query.leftJoin(Factory.getDBO().quoteName("product", "p") + " ON " + Factory.getDBO().quoteName("p.id") + " = " + Factory.getDBO().quoteName("h.prod"));
|
||||
query.where(Factory.getDBO().quoteName("h.user") + " = " + Factory.getDBO().quote(u.GetId().ToString()));
|
||||
if (lastMonth)
|
||||
{
|
||||
query.where(Factory.getDBO().quoteName("h.time") + " >= DATE_SUB(NOW(),INTERVAL 30 DAY)");
|
||||
}
|
||||
|
||||
Factory.getDBO().setQuery(query);
|
||||
|
||||
object[] row = Factory.getDBO().getResult();
|
||||
if (row == null)
|
||||
{
|
||||
return new Tuple<int, double>(0,0);
|
||||
}
|
||||
return new Tuple<int, double>(int.Parse(row[0].ToString()), double.Parse(row[1].ToString()) / 1000);
|
||||
}
|
||||
|
||||
public static List<int> GetDrunkProductsChart(User u, Product item, bool lastMonth, int days = 30)
|
||||
{
|
||||
DBQuery query = Factory.getDBO().getQuery(true);
|
||||
query.select(Factory.getDBO().quoteName("h.prod", "product"));
|
||||
query.select(Factory.getDBO().quoteName("h.time", "time"));
|
||||
query.from(Factory.getDBO().quoteName("history", "h"));
|
||||
query.order(Factory.getDBO().quoteName("h.time")+" ASC");
|
||||
query.where(Factory.getDBO().quoteName("h.user") + " = " + Factory.getDBO().quote(u.GetId().ToString()));
|
||||
if (lastMonth)
|
||||
{
|
||||
query.where(Factory.getDBO().quoteName("h.time") + " >= DATE_SUB(NOW(),INTERVAL 30 DAY)");
|
||||
}
|
||||
|
||||
Factory.getDBO().setQuery(query);
|
||||
|
||||
List<object[]> rows = Factory.getDBO().getResultList();
|
||||
List<DateTime> bottles = new List<DateTime>();
|
||||
List<int> ret = new List<int>();
|
||||
if (rows == null)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
foreach (object[] row in rows)
|
||||
{
|
||||
bottles.Add((DateTime)row[1]);
|
||||
}
|
||||
DateTime first = bottles.ElementAt(0);
|
||||
DateTime last = DateTime.Now;
|
||||
if (lastMonth)
|
||||
{
|
||||
first = last.Subtract(TimeSpan.FromDays(30));
|
||||
}
|
||||
double step = (last - first).TotalSeconds / days;
|
||||
int max = 0;
|
||||
List<int> tmplist = new List<int>();
|
||||
for (int i = 0; i < days; i++)
|
||||
{
|
||||
inRange_f = first.AddSeconds(step * i);
|
||||
inRange_t = first.AddSeconds((step * (i + 1)) - 1);
|
||||
int v = bottles.FindAll(inRange).Count();
|
||||
tmplist.Add(v);
|
||||
if (v > max)
|
||||
max = v;
|
||||
}
|
||||
foreach (int point in tmplist)
|
||||
{
|
||||
ret.Add((int)Math.Round(7 * ((double)point / (double)max)));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
private static DateTime inRange_f = DateTime.Now;
|
||||
private static DateTime inRange_t = DateTime.Now;
|
||||
private static bool inRange(DateTime el)
|
||||
{
|
||||
if (el >= inRange_f && el < inRange_t)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -165,9 +165,9 @@ namespace Matomat.Output
|
||||
this.displayEscCode("UDC1@@@@@@@_"); //[1, 0x81] Strich 1te von unten
|
||||
this.displayEscCode("UDC2@@@@@_@@"); //[2, 0x82] Strich 3te von unten
|
||||
this.displayEscCode("UDC3@@@@_@@@"); //[3, 0x83] Strich 4te von unten
|
||||
this.displayEscCode("UDC4@@_@@@@@"); //[4, 0x84] Strich 3te von unten
|
||||
this.displayEscCode("UDC5@_@@@@@@"); //[5, 0x05] Strich 3te von unten
|
||||
this.displayEscCode("UDC6_@@@@@@@"); //[6, 0x06] Strich 3te von unten
|
||||
this.displayEscCode("UDC4@@_@@@@@"); //[4, 0x84] Strich 6te von unten
|
||||
this.displayEscCode("UDC5@_@@@@@@"); //[5, 0x05] Strich 7te von unten
|
||||
this.displayEscCode("UDC6_@@@@@@@"); //[6, 0x06] Strich 8te von unten
|
||||
}
|
||||
|
||||
private void displayEscCode(string code)
|
||||
@ -218,7 +218,19 @@ namespace Matomat.Output
|
||||
"²" + line2 + "²" +
|
||||
"²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²", status, time);
|
||||
}
|
||||
|
||||
|
||||
public string CenterString(string text, int length = 40)
|
||||
{
|
||||
if (text.Length > length)
|
||||
text = text.Substring(0, length);
|
||||
double textlength = ((((double)length) - text.Length) / 2);
|
||||
|
||||
text = text.PadLeft((int)Math.Floor(textlength) + text.Length, ' ');
|
||||
text = text.PadRight((int)Math.Ceiling(textlength) + text.Length, ' ');
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Prints a text on the display with the minimum duration of the time and beebcodes when status is not Status.OK
|
||||
/// if the text is >= than 160 Chars it will display a border.
|
||||
|
@ -17,6 +17,7 @@ namespace Matomat
|
||||
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
test();
|
||||
InitMainThread();
|
||||
Thread t = new Thread(MainThread);
|
||||
t.Start();
|
||||
@ -27,6 +28,12 @@ namespace Matomat
|
||||
}
|
||||
}
|
||||
|
||||
private static void test()
|
||||
{
|
||||
User u = new User(2855543482);
|
||||
Instruction.InsShowStats(u, true);
|
||||
}
|
||||
|
||||
#region MainThread
|
||||
private static void InitMainThread()
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user