BasicDBObject typeStatRawData = new BasicDBObject();\r
typeStat.put("rawData", typeStatRawData);\r
long sumduration = 0;\r
+ long sumIngestDuration = 0;\r
+ long sumIngestCount = 0;\r
+ long sumArchiveDuration = 0;\r
+ long sumArchiveCount = 0;\r
\r
List<BasicDBObject> rawData = new ArrayList<>();\r
for (BasicDBObject story : stories.values()) {\r
ingestDuration = ingestInfo.getLong("duration");\r
raw.put("ingest_count", ingestCount);\r
raw.put("ingest_duration", ingestDuration);\r
+ sumIngestCount += ingestCount;\r
+ sumIngestDuration += ingestDuration;\r
}\r
\r
long archiveCount = 0;\r
archiveDuration = ingestInfo.getLong("duration");\r
raw.put("archive_count", archiveCount);\r
raw.put("archive_duration", archiveDuration);\r
+ sumArchiveCount += archiveCount;\r
+ sumArchiveDuration += archiveDuration;\r
}\r
\r
rawData.add(raw);\r
\r
planStat.put("all_count", rawData.size());\r
planStat.put("all_duration", sumduration);\r
+ planStat.put("archive_count", sumArchiveCount);\r
+ planStat.put("archive_duration", sumArchiveDuration);\r
+ planStat.put("ingest_count", sumIngestCount);\r
+ planStat.put("ingest_duration", sumIngestDuration);\r
\r
store(scheduledDate, rawData, typeStat, planStat);\r
return null;\r
--- /dev/null
+function statisticsXValue(value) {\r
+ var hour = Math.floor(value / 60);\r
+ var minute = value % 60;\r
+ if (hour == 0)\r
+ if (minute == 0)\r
+ return "";\r
+ hour = ("" + hour).length == 1 ? '0' + hour : hour;\r
+ minute = ("" + minute).length == 1 ? '0' + minute : minute;\r
+ return hour + ':' + minute;\r
+}\r
+\r
+function statisticsYValue(value, series) {\r
+ var options = series[value - 1];\r
+ console.log("statisticsYValue", series.name, value, series);\r
+ return options == null ? "" : options.userOptions.name;\r
+}\r
+\r
+if (!String.format) {\r
+ String.format = function(format) {\r
+ var args = Array.prototype.slice.call(arguments, 1);\r
+ return format.replace(/{(\d+)}/g, function(match, number) {\r
+ return typeof args[number] != 'undefined' ? args[number]\r
+ : match;\r
+ });\r
+ };\r
+}\r
+\r
+function statistics(value) {\r
+ // console.log("statistics", value, series);\r
+ var obj = eval("(" + value.name + ')');\r
+ return String\r
+ .format(\r
+ 'Kézbesítve . {0} <br/> Elkezdve . {1} <br/> Befejezve . {2} <br/> Azonosító . {3} <br/> Forrás . {4} <br/> Cél . {5} <br/> Cimke . <span style="background:{6}">{7}</span> <br/> Sikeres . {8} <br/> Felhasználó . {9}',\r
+ obj.Touched, obj.Started, obj.Finished, obj.HouseId, obj.Source, obj.Destination,\r
+ obj.Tag, obj.Tag, obj.Successful, obj.UserName);\r
+}\r
<?xml version="1.0" encoding="UTF-8"?>\r
<zk xmlns="http://www.zkoss.org/2005/zul">\r
<vlayout hflex="1" vflex="1" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('user.jobengine.zk.model.NewsHistoryModel')">\r
- <hbox height="10px" hflex="1" />\r
- <hlayout hflex="1">\r
+ <hbox height="40px" align="center">\r
<space bar="false" />\r
- <datebox value="@bind(vm.selectedDate)" width="150px" format="yyyy.MM.dd" lenient="false" compact="false" buttonVisible="true"\r
+ <datebox value="@bind(vm.selectedDate)" width="150px" format="yyyy.MM.dd" mold="rounded" weekOfYear="true" showTodayLink="true" lenient="false" compact="false" buttonVisible="true"\r
constraint="no empty, no future: now or never" />\r
- </hlayout>\r
- <hbox height="10px" hflex="1" />\r
- <hlayout hflex="1" vflex="1">\r
+ </hbox>\r
+<!-- <hlayout hflex="1" vflex="1"> -->\r
<tabbox hflex="1" vflex="1">\r
<tabs>\r
<tab label="Grafikonok" closable="false" />\r
<charts id="typeChartSumDuration" type="pie" />\r
</div>\r
<div width="100%" onAfterSize='planChart.setWidth(new Integer(event.getWidth()))'>\r
- <charts id="planChart" type="pie" />\r
+ <charts id="planChart" type="column" />\r
</div>\r
</row>\r
</rows>\r
</grid>\r
- <!-- <vlayout style="overflow:auto;text-align:center;" height="100%" width="100%"> -->\r
- <!-- <hlayout width="100%"> -->\r
- <!-- </hlayout> -->\r
- <!-- </vlayout> -->\r
</tabpanel>\r
<tabpanel>\r
- <grid model="@load(vm.dataList)" mold="paging" sizedByContent="default" vflex="1" hflex="1" emptyMessage="Nincs adat!">\r
+ <grid model="@load(vm.dataList)" mold="paging" autopaging="true" sizedByContent="false" vflex="true" hflex="true" emptyMessage="Nincs adat!">\r
<auxhead>\r
<auxheader colspan="11" align="right">\r
<a href="javascript:void(0);" label="letöltés" onClick="@command('downloadRawData')" disabled="@load(vm.downloadDisabled)" />\r
</tabpanel>\r
</tabpanels>\r
</tabbox>\r
- </hlayout>\r
+<!-- </hlayout> -->\r
</vlayout>\r
</zk>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>\r
<?init class="user.jobengine.zk.util.AdminAuthInitiator"?>\r
-<window apply="user.jobengine.zk.model.StatisticsComposer" width="100%" height="100%">\r
-\r
-<div width="100%" height="5%">\r
- <label value="Dátum:" />\r
- <datebox id="chartDateSelector" width="150px" format="yyyy.MM.dd"\r
- lenient="false" compact="false" buttonVisible="true" disabled="false" />\r
- <radiogroup>\r
- <radio label="Híranyagok" />\r
- <radio label="Műsorok" />\r
- </radiogroup> \r
- <space bar="false" />\r
- <button id="btnShowChart" label="Megjelenít" />\r
-</div>\r
-\r
-<script>\r
- function statisticsXValue(value) {\r
- var hour = Math.floor(value / 60);\r
- var minute = value % 60;\r
- if (hour == 0)\r
- if (minute == 0)\r
- return "";\r
- hour = ("" + hour).length == 1 ? '0' + hour : hour;\r
- minute = ("" + minute).length == 1 ? '0' + minute : minute;\r
- return hour + ':' + minute;\r
- }\r
-\r
- function statisticsYValue(value, series) {\r
- var options = series[value - 1];\r
- console.log("statisticsYValue", series.name, value, series);\r
- return options == null ? "" : options.userOptions.name;\r
- }\r
-\r
- if (!String.format) {\r
- String.format = function(format) {\r
- var args = Array.prototype.slice.call(arguments, 1);\r
- return format.replace(/{(\d+)}/g, function(match, number) {\r
- return typeof args[number] != 'undefined' ? args[number]\r
- : match;\r
- });\r
- };\r
- }\r
-\r
- function statistics(value) {\r
- // console.log("statistics", value, series);\r
- var obj = eval("(" + value.name + ')');\r
- return String\r
- .format(\r
- 'Kézbesítve . {0} <br/> Elkezdve . {1} <br/> Befejezve . {2} <br/> Azonosító . {3} <br/> Forrás . {4} <br/> Cél . {5} <br/> Cimke . <span style="background:{6}">{7}</span> <br/> Sikeres . {8} <br/> Felhasználó . {9}',\r
- obj.Touched, obj.Started, obj.Finished, obj.HouseId, obj.Source, obj.Destination,\r
- obj.Tag, obj.Tag, obj.Successful, obj.UserName);\r
- }\r
-</script> \r
- <div width="100%" height="95%" style="overflow:auto;" onAfterSize='chart.setWidth(new Integer(event.getWidth()-20))'>\r
- <charts id="chart" type="spline" zoomType="x" /> \r
- </div>\r
-</window>\r
+<zk>\r
+ <script>\r
+ function statisticsXValue(value) {\r
+ var hour = Math.floor(value / 60);\r
+ var minute = value % 60;\r
+ if (hour == 0)\r
+ if (minute == 0)\r
+ return "";\r
+ hour = ("" + hour).length == 1 ? '0' + hour : hour;\r
+ minute = ("" + minute).length == 1 ? '0' + minute : minute;\r
+ return hour + ':' + minute;\r
+ }\r
+ \r
+ function statisticsYValue(value, series) {\r
+ var options = series[value - 1];\r
+ console.log("statisticsYValue", series.name, value, series);\r
+ return options == null ? "" : options.userOptions.name;\r
+ }\r
+ </script>\r
+ <vlayout vflex="1" hflex="1" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('user.jobengine.zk.model.StatisticsModel')">\r
+ <hbox height="40px" align="center">\r
+ <space bar="false" />\r
+ <datebox value="@bind(vm.selectedDate)" width="150px" format="yyyy.MM.dd" lenient="false" compact="false" buttonVisible="true"\r
+ constraint="no empty, no future: now or never" />\r
+ <radiogroup selectedIndex="@bind(vm.selectedType)">\r
+ <radio label="Híranyagok" />\r
+ <radio label="Műsorok" />\r
+ </radiogroup>\r
+ </hbox>\r
+ <div vflex="1" hflex="1" style="overflow:auto;" onAfterSize='chart.setWidth(new Integer(event.getWidth() - 20))'>\r
+ <charts id="chart" type="spline" zoomType="x" />\r
+ </div>\r
+ </vlayout>\r
+</zk>\r
+++ /dev/null
-<?xml version="1.0" encoding="ISO-8859-2"?>\r
-<window apply="user.jobengine.zk.model.StatisticsChartComposer">\r
-\r
- <div width="100%" height="5%">\r
- <label value="Dátum:"/>\r
- <datebox id="chartDateFrom" width="150px" format="yyyy.MM.dd" disabled="false" />\r
- <space bar="false"/>\r
- <button id="btnShowChart" label="Megjelenít" />\r
- </div>\r
- \r
- <div width="100%" height="95%">\r
- <charts id="chart" type="arearange" height="1000" title="Octopus lista"/>\r
- </div>\r
- \r
-</window>\r
-\r
-\r
-\r
-\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<window id="wnd" title="Anyag életút" width="900px" sizable="true" border="normal" apply="org.zkoss.bind.BindComposer"\r
+ viewModel="@id('vm') @init('user.jobengine.zk.model.StatisticsDetailsModel')" forward="onCancel=closeButton.onClick">\r
+ <hlayout height="450px">\r
+ <grid sizedByContent="true" model="@load(vm.events)" vflex="true" hflex="true" style="border: none; background: #e3e3e3 !important;">\r
+ <columns sizable="true">\r
+ <column forEach="${vm.columnList}" label="${each}"></column>\r
+ </columns>\r
+ <rows>\r
+ <template name="model" var="r">\r
+ <row>\r
+ <label forEach="${vm.columnList}" value="${r.get(each)}">\r
+ <attribute name="style" if="${vm.isSelected(r)}">\r
+ color: green;\r
+ </attribute> \r
+ </label>\r
+ </row>\r
+ </template>\r
+ </rows>\r
+ </grid>\r
+ </hlayout>\r
+ <hbox width="100%" height="40px" pack="center" align="center">\r
+ <button id="closeButton" label="Bezár" onClick="@command('close')" />\r
+ </hbox>\r
+</window>\r
--- /dev/null
+package user.jobengine.zk.model;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+\r
+public class MetadataTypeDetector {\r
+ public enum MetadataType {\r
+ TRAFFIC, OCTOPUS, GENERIC\r
+ }\r
+\r
+ private static final String REGEXP_TRAFFIC = "^[MRP]{1}[0-9]{6}[A-Z]{1}$";\r
+ private static final String REGEXP_OCTOPUSSTORYID = "^[0-9]+$";\r
+ private static final String REGEXP_OCTOPUSPLACEHOLDERID = "^[0-9]+_[0-9]+$";\r
+ private static final String REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID = "^[0-9]+_[0-9]+-[0-9]{3}$";\r
+\r
+ public static MetadataType GuessMetadataType(String id) {\r
+ if (StringUtils.isBlank(id))\r
+ return MetadataType.GENERIC;\r
+ if (id.matches(REGEXP_TRAFFIC))\r
+ return MetadataType.TRAFFIC;\r
+ if (id.matches(REGEXP_OCTOPUSSTORYID))\r
+ return MetadataType.OCTOPUS;\r
+ if (id.matches(REGEXP_OCTOPUSPLACEHOLDERID))\r
+ return MetadataType.OCTOPUS;\r
+ if (id.matches(REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID))\r
+ return MetadataType.OCTOPUS;\r
+ return MetadataType.GENERIC;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.zk.model;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.zkoss.chart.Charts;\r
+import org.zkoss.chart.Point;\r
+import org.zkoss.chart.Series;\r
+import org.zkoss.chart.YAxis;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.commons.nosql.NoSQLUtils;\r
+\r
+public class NewsHistoryCharts {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ private static void fill(Charts charts, BasicDBObject datas, String member) {\r
+ Point maxPoint = null;\r
+ BasicDBObject rawData = (BasicDBObject) datas.get("rawData");\r
+ for (String name : rawData.keySet()) {\r
+ BasicDBObject dbo = NoSQLUtils.asDBObject(rawData, name);\r
+ Number y = dbo.getLong(member);\r
+ Point point = new Point(name, y);\r
+ charts.getSeries().addPoint(point);\r
+ if (maxPoint == null || y.longValue() > maxPoint.getY().longValue())\r
+ maxPoint = point;\r
+ }\r
+\r
+ if (maxPoint != null) {\r
+ maxPoint.setSliced(true);\r
+ maxPoint.setSelected(true);\r
+ }\r
+ }\r
+\r
+ private static void init(Charts charts) {\r
+ charts.getChart().setPlotBorderWidth(0);\r
+ charts.getChart().setPlotShadow(false);\r
+ charts.getPlotOptions().getSeries().setAnimation(false);\r
+ charts.getPlotOptions().getSeries().setAllowPointSelect(false);\r
+ charts.getPlotOptions().getSeries().setEnableMouseTracking(false);\r
+ charts.getPlotOptions().getSeries().setShowInLegend(true);\r
+ }\r
+\r
+ public static void initMultiAxis(Charts charts, BasicDBObject planStat) {\r
+ init(charts);\r
+ charts.getXAxis().setCategories("Összes", "Betöltve", "Adásban", "Kihagyva", "Archivált");\r
+ YAxis yAxis1 = charts.getYAxis();\r
+ yAxis1.getLabels().setFormat("{value} db");\r
+ yAxis1.getLabels().setStyle("color: " + charts.getColors().get(1).stringValue());\r
+ yAxis1.setTitle("Darab");\r
+ yAxis1.getTitle().setStyle("color: " + charts.getColors().get(1).stringValue());\r
+\r
+ // Secondary y axis\r
+ YAxis yAxis2 = charts.getYAxis(1);\r
+ yAxis2.setTitle("Hossz");\r
+ yAxis2.getTitle().setStyle("color: " + charts.getColors().get(0).stringValue());\r
+ yAxis2.getLabels().setFormat("{value} kocka");\r
+ yAxis2.getLabels().setStyle("color: " + charts.getColors().get(0).stringValue());\r
+ yAxis2.setOpposite(true);\r
+\r
+ Series s1 = charts.getSeries(0);\r
+ s1.setName("Darab");\r
+ s1.setType("column");\r
+ s1.setYAxis(1);\r
+ s1.setData(new Double[] { 49.9, 71.5, 106.4, 129.2, 144.0 });\r
+ charts.getPlotOptions().getColumn().getTooltip().setValueSuffix(" db");\r
+\r
+ Series s2 = charts.getSeries(1);\r
+ s2.setName("Hossz");\r
+ s2.setType("column");\r
+ s2.setData(new Double[] { 7.0, 6.9, 9.5, 14.5, 18.2 });\r
+ charts.getPlotOptions().getSpline().getTooltip().setValueSuffix(" képkocka");\r
+ }\r
+\r
+ static public void initTypeCount(Charts charts, BasicDBObject datas) {\r
+ init(charts);\r
+ charts.setTitle("Adásbejátszók száma típus szerint");\r
+ charts.getSeries().getDataLabels().setFormat("{point.name} {point.y} db");\r
+ fill(charts, datas, "count");\r
+ }\r
+\r
+ static public void initTypeDuration(Charts charts, BasicDBObject datas) {\r
+ init(charts);\r
+ charts.setTitle("Adásbejátszók hossza típus szerint");\r
+ charts.getSeries().getDataLabels().setFormat("{point.name} {point.y} képkocka");\r
+ fill(charts, datas, "duration");\r
+ }\r
+\r
+}\r
package user.jobengine.zk.model;\r
\r
+import java.io.UnsupportedEncodingException;\r
import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
import java.util.Arrays;\r
import java.util.Calendar;\r
+import java.util.Collections;\r
import java.util.Date;\r
import java.util.List;\r
\r
import org.zkoss.zk.ui.Component;\r
import org.zkoss.zk.ui.select.Selectors;\r
import org.zkoss.zk.ui.select.annotation.Wire;\r
+import org.zkoss.zul.Messagebox;\r
\r
-import com.ibm.nosql.json.api.BasicDBList;\r
import com.ibm.nosql.json.api.BasicDBObject;\r
import com.ibm.nosql.json.api.DB;\r
import com.ibm.nosql.json.api.DBCollection;\r
Charts typeChartSumDuration;\r
@Wire\r
Charts planChart;\r
- private BasicDBList currentRawData;\r
\r
@AfterCompose\r
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
Selectors.wireComponents(view, this, false);\r
-\r
setSelectedDate(new Date());\r
}\r
\r
private void clearChart(Charts charts) {\r
- int size = charts.getSeriesSize();\r
- for (int i = 0; i < size; i++)\r
- charts.getSeries(i).setData(new ArrayList<Integer>());\r
-\r
- Options options = charts.getOptions();\r
- if (options == null)\r
- options = new Options();\r
+ int seriesSize = charts.getSeriesSize();\r
+ for (int i = 0; i < seriesSize; i++) {\r
+ charts.getSeries(0).remove();\r
+ }\r
\r
- Lang lang = options.getLang();\r
- if (lang == null)\r
- lang = new Lang();\r
+ int axisSize = charts.getyAxisSize();\r
+ for (int i = 0; i < axisSize; i++) {\r
+ charts.getYAxis(i).remove();\r
+ }\r
\r
- options.setLang(lang);\r
- charts.setOptions(options);\r
charts.setTitle("");\r
charts.setSubtitle("");\r
- lang.setNoData("Nincs adat!");\r
- charts.getTooltip().setEnabled(false);\r
- charts.getExporting().setEnabled(false);\r
}\r
\r
@Command\r
public void downloadRawData() {\r
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");\r
- byte[] content = currentRawData.toJSON().getBytes();\r
- Filedownload.save(content, "text/csv", String.format("%s-news-stat.csv", dateFormat.format(selectedDate)));\r
+ StringBuilder data = new StringBuilder();\r
+\r
+ boolean headeradded = false;\r
+ for (BasicDBObject o : dataList) {\r
+ if (!headeradded) {\r
+ for (String key : o.keySet())\r
+ data.append(key).append(";");\r
+ data.append("\r\n");\r
+ headeradded = true;\r
+ }\r
+ for (String key : o.keySet())\r
+ data.append(o.getString(key)).append(";");\r
+ data.append("\r\n");\r
+ }\r
+\r
+ byte[] content;\r
+ try {\r
+ content = data.toString().getBytes("ISO-8859-2");\r
+ Filedownload.save(content, "text/csv", String.format("%s-news-stat.csv", dateFormat.format(selectedDate)));\r
+ } catch (UnsupportedEncodingException e) {\r
+ Messagebox.show("Sikertelen tranfszormáció. A rendszer üzenete: " + e.getMessage());\r
+ }\r
}\r
\r
public List<String> getColumnList() {\r
collection = db.getCollection("daily_news_history");\r
}\r
\r
+ private void initChart(Charts charts) {\r
+ Options options = charts.getOptions();\r
+ if (options == null)\r
+ options = new Options();\r
+ charts.setOptions(options);\r
+\r
+ Lang lang = options.getLang();\r
+ if (lang == null)\r
+ lang = new Lang();\r
+\r
+ options.setLang(lang);\r
+ lang.setNoData("Nincs adat!");\r
+ charts.getTooltip().setEnabled(false);\r
+ charts.getExporting().setEnabled(false);\r
+ }\r
+\r
public boolean isDownloadDisabled() {\r
return downloadDisabled;\r
}\r
\r
clearChart(typeChartCount);\r
clearChart(typeChartSumDuration);\r
+ clearChart(planChart);\r
+\r
+ initChart(typeChartCount);\r
+ initChart(typeChartSumDuration);\r
+ initChart(planChart);\r
\r
Calendar scheduledDate = CalendarUtils.createZeroCalendar(selectedDate);\r
BasicDBObject dateFilter = new BasicDBObject("dateTime", scheduledDate.getTime());\r
if (dailyData == null) {\r
return;\r
}\r
- currentRawData = NoSQLUtils.asDBList(dailyData, "rawData");\r
\r
- setDataList(NoSQLUtils.asList(dailyData, "rawData"));\r
+ dataList = NoSQLUtils.asList(dailyData, "rawData");\r
if (dataList == null || dataList.size() == 0) {\r
return;\r
}\r
\r
+ Collections.sort(dataList, (o1, o2) -> {\r
+ return o1.getString(IOctopusAPI.NAME).compareTo(o2.getString(IOctopusAPI.NAME));\r
+ });\r
+\r
BindUtils.postNotifyChange(null, null, this, "dataList");\r
\r
BasicDBObject typeStat = NoSQLUtils.asDBObject(dailyData, "typeStat");\r
+ NewsHistoryCharts.initTypeCount(typeChartCount, typeStat);\r
+ NewsHistoryCharts.initTypeDuration(typeChartSumDuration, typeStat);\r
\r
- NewsMaterialTypeChart.initTypeCount(typeChartCount, typeStat);\r
- NewsMaterialTypeChart.initDurationDuration(typeChartSumDuration, typeStat);\r
+ BasicDBObject planStat = NoSQLUtils.asDBObject(dailyData, "planStat");\r
+ NewsHistoryCharts.initMultiAxis(planChart, planStat);\r
setDownloadDisabled(false);\r
}\r
\r
+++ /dev/null
-package user.jobengine.zk.model;\r
-\r
-import org.apache.logging.log4j.LogManager;\r
-import org.apache.logging.log4j.Logger;\r
-import org.zkoss.chart.Charts;\r
-import org.zkoss.chart.Point;\r
-\r
-import com.ibm.nosql.json.api.BasicDBObject;\r
-\r
-import user.commons.nosql.NoSQLUtils;\r
-\r
-public class NewsMaterialTypeChart {\r
- private static final Logger logger = LogManager.getLogger();\r
-\r
- private static void fill(Charts charts, BasicDBObject datas, String member) {\r
- Point maxPoint = null;\r
- BasicDBObject rawData = (BasicDBObject) datas.get("rawData");\r
- for (String name : rawData.keySet()) {\r
- BasicDBObject dbo = NoSQLUtils.asDBObject(rawData, name);\r
- Number y = dbo.getLong(member);\r
- Point point = new Point(name, y);\r
- charts.getSeries().addPoint(point);\r
- if (maxPoint == null || y.longValue() > maxPoint.getY().longValue())\r
- maxPoint = point;\r
- }\r
-\r
- if (maxPoint != null) {\r
- maxPoint.setSliced(true);\r
- maxPoint.setSelected(true);\r
- }\r
- }\r
-\r
- private static void init(Charts charts) {\r
- charts.getChart().setPlotBorderWidth(0);\r
- charts.getChart().setPlotShadow(false);\r
- charts.getPlotOptions().getPie().setAllowPointSelect(false);\r
- charts.getPlotOptions().getPie().setEnableMouseTracking(false);\r
- charts.getPlotOptions().getPie().setShowInLegend(true);\r
- charts.getPlotOptions().getPie().setAnimation(false);\r
- }\r
-\r
- static public void initTypeCount(Charts charts, BasicDBObject datas) {\r
- init(charts);\r
- charts.setTitle("Adásbejátszók száma típus szerint");\r
- charts.getSeries().getDataLabels().setFormat("{point.name} {point.y} db");\r
- fill(charts, datas, "count");\r
- }\r
-\r
- static public void initDurationDuration(Charts charts, BasicDBObject datas) {\r
- init(charts);\r
- charts.setTitle("Adásbejátszók hossza típus szerint");\r
- charts.getSeries().getDataLabels().setFormat("{point.name} {point.y} képkocka");\r
- fill(charts, datas, "duration");\r
- }\r
-\r
-}\r
+++ /dev/null
-package user.jobengine.zk.model;\r
-\r
-import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
-import java.util.Calendar;\r
-import java.util.Date;\r
-import java.util.Hashtable;\r
-import java.util.List;\r
-import java.util.Random;\r
-import java.util.TimeZone;\r
-\r
-import org.zkoss.chart.Charts;\r
-import org.zkoss.chart.PlotBand;\r
-import org.zkoss.chart.Series;\r
-import org.zkoss.chart.YAxis;\r
-import org.zkoss.chart.model.DefaultXYZModel;\r
-import org.zkoss.chart.model.XYZModel;\r
-import org.zkoss.zk.ui.select.SelectorComposer;\r
-import org.zkoss.zk.ui.select.annotation.Listen;\r
-import org.zkoss.zk.ui.select.annotation.Wire;\r
-import org.zkoss.zul.Datebox;\r
-import org.zkoss.zul.Window;\r
-\r
-public class StatisticsChartComposer extends SelectorComposer<Window> {\r
-\r
- private SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm");\r
-\r
- @Wire\r
- private Datebox chartDateFrom;\r
- \r
- @Wire\r
- private Charts chart;\r
- //private CategoryModel model;\r
- \r
- private Date chartDate = new Date();\r
- \r
- //KONSTRUKTOR\r
- public void doAfterCompose(Window comp) throws Exception {\r
- super.doAfterCompose(comp);\r
- initModel(chartDate);\r
- } \r
- \r
-\r
- @Listen("onChange = #chartDateFrom")\r
- public void changeDate(){\r
- chartDate = chartDateFrom.getValue();\r
- } \r
-\r
- @Listen("onClick = #btnShowChart")\r
- public void generateChart(){\r
- if(chartDateFrom.getValue() != null){\r
- initModel(chartDate);\r
- }\r
- }\r
- \r
- \r
- \r
- private void initModel(Date chartDate){\r
-\r
- chart.setReflow(true);\r
- chart.getChart().setReflow(true);\r
- chart.getLegend().setEnabled(false); //also series folsorolas\r
- //chart.setSubtitle((Subtitle)null);\r
- \r
- XYZModel model = generateModel(chartDate);\r
-\r
- //GENERATE FAKE System names, colors, titles (tobb series is ugyanaz a system, csak igy tudja felrajzolni a chartot normalisan) \r
- String[] sysNames = new String[10];\r
- Hashtable<String, String> colorMap = new Hashtable<String, String>();\r
- Hashtable<String, String> titleMap = new Hashtable<String, String>();\r
- for(int s=0; s<10; s++){\r
- sysNames[s] = "sys" + s;\r
- colorMap.put(sysNames[s], getRNDColor());\r
- }\r
- colorMap.put("syswhite", "#FFFFFF");\r
- \r
- \r
- //CONFIG SERIES\r
- //model series csak stringet ad vissza.\r
- Object[] seriesNames = model.getSeries().toArray();\r
- for(int s=0; s<seriesNames.length; s++){\r
- \r
- String[] sysNameParts = seriesNames[s].toString().split("_");\r
- Series ret = chart.getSeries(s);\r
- ret.setColor(colorMap.get(sysNameParts[0])); //"#FF00FF" series szinet beallitani system name alapjan\r
- ret.getMarker().setEnabled(false);\r
- ret.setYAxis(0);\r
- \r
- if(!sysNameParts[0].equals("syswhite")){\r
- ret.getPlotOptions().getTooltip().setHeaderFormat("<b>{point.x:%Y.%m.%d %H:%M:%S}</b><br/>");\r
- ret.getPlotOptions().getTooltip().setPointFormat(sysNameParts[0] + " on " + sysNameParts[1] + " object.");\r
- //ret.getPlotOptions().getTooltip().setValueSuffix(""); //valueSuffix es value resz eltuntetese Y coord \r
- //ret.getPlotOptions().getTooltip().setFooterFormat("<br><b>footerFormat</b>");\r
- //System.out.println("format: " + ret.getPlotOptions().getTooltip().getFormat());\r
- //ret.setName("title");\r
- }else{\r
- ret.getPlotOptions().getTooltip().setHeaderFormat("");\r
- ret.getPlotOptions().getTooltip().setPointFormat("");\r
- }\r
- }\r
- \r
- //config Y axis\r
- YAxis yaxis = chart.getYAxis();\r
- yaxis.getLabels().setEnabled(false);\r
- yaxis.setTitle(" ");\r
-// yaxis.getLabels().setFormat("{value}°C"); //"{value}°C"\r
-// yaxis.getLabels().setStyle("color: '#0000FF'"); //"color: '#89A54E'"\r
-// yaxis.getTitle().setStyle("color: '#FF0000'"); //"color: '#89A54E'"\r
-// yaxis.setOpposite(true);\r
- yaxis.setMinPadding(0);\r
- yaxis.setMaxPadding(0);\r
- yaxis.setMin(1);\r
- yaxis.setMax(50);\r
- yaxis.setGridLineWidth(0);\r
- \r
- yaxis.setMinorGridLineWidth(0);\r
- yaxis.setAlternateGridColor((String) null);\r
-\r
-/*\r
- XAxis xAxis = chart.getXAxis();\r
- xAxis.setTickInterval(new Long(3000000000000L)); //ez azert van, hogy alul egyetlen datum se jelenjen meg.\r
- xAxis.setTickWidth(0);\r
- xAxis.setGridLineWidth(1);\r
- xAxis.setEndOnTick(false);\r
- xAxis.setStartOnTick(false);\r
-// xAxis.setCategories(timeList);\r
-// xAxis.setType("datetime");\r
-// chart.getTooltip().setHeaderFormat("<b>{point.x:%Y.%m.%d %H:%M:%S}</b><br/>");\r
-*/\r
- \r
- chart.setModel(model);\r
- } \r
-\r
- \r
- \r
- \r
- private XYZModel generateModel(Date pDate){\r
- XYZModel model = new DefaultXYZModel();\r
-\r
- //set values\r
- double rowHeight = 1.5;\r
- double rowGap = 0.5;\r
- double rowY = 0;\r
- \r
- YAxis yaxis = chart.getYAxis();\r
-\r
- List<OctopusObject> objectList = generateFakeList(pDate);\r
- for(OctopusObject oo : objectList){\r
- \r
- PlotBand plotBand = new PlotBand(rowY, rowY+rowHeight, "rgba(0, 0, 0, 0.0)");\r
- plotBand.getLabel().setText("Object: " + oo.id);\r
- //plotBand1.getLabel().setStyle("color: '#000000'; font-size: 12px; font-weight: bold;");\r
- plotBand.getLabel().setStyle("color: rgba(0, 0, 0, 1.0); font-size: 12px; font-weight: bold;");\r
- yaxis.addPlotBand(plotBand);\r
- \r
- for(OctopusEvent oe : oo.eventList){\r
- //system, sx, sy, ey\r
- //oe.systemName + oo.id\r
-// model.addValue(oe.systemName, (Number)oe.startTime.getTime(), (Number)new Double(rowY), (Number)new Double(rowY+rowHeight));\r
-// model.addValue(oe.systemName, (Number)oe.endTime.getTime(), (Number)new Double(rowY), (Number)new Double(rowY+rowHeight));\r
-\r
- //ugyelni kell ra, hogy a zk az azonos nevu sorozatokat osszekoti egymassal.\r
- long s = oe.startTime.getTime();\r
- for(long i=0; i<10; i++){\r
- model.addValue(oe.systemName, (Number)s, (Number)new Double(rowY), (Number)new Double(rowY+rowHeight));\r
- model.addValue(oe.systemName, (Number)(s+50000), (Number)new Double(rowY), (Number)new Double(rowY+rowHeight));\r
- s+=50000;\r
- model.addValue("syswhite_" + oo.id + "_" + s, (Number)s, (Number)new Double(rowY), (Number)new Double(rowY+rowHeight));\r
- model.addValue("syswhite_" + oo.id + "_" + s, (Number)(s+30000), (Number)new Double(rowY), (Number)new Double(rowY+rowHeight));\r
- s+=30000;\r
- }\r
- \r
- }\r
- rowY+=(rowHeight + rowGap);\r
- }\r
- \r
- \r
- return model;\r
- } \r
- \r
- \r
- private List<OctopusObject> generateFakeList(Date paramDate){\r
- List<OctopusObject> ret = new ArrayList<OctopusObject>();\r
- Random r = new Random();\r
- \r
- Calendar calendar = Calendar.getInstance();\r
- calendar.setTimeZone(TimeZone.getDefault());\r
- \r
- //create objects\r
- for(int o=0;o<10;o++){\r
- \r
- calendar.setTime(paramDate);\r
- calendar.set(Calendar.MILLISECOND, 0);\r
- calendar.set(Calendar.MINUTE, 0);\r
- calendar.set(Calendar.SECOND , 0);\r
- calendar.set(Calendar.HOUR_OF_DAY, 0);\r
-\r
-//time patch \r
-calendar.add(Calendar.HOUR_OF_DAY, 1);\r
-//nyari idoszamitaskor ket orát kell hozzaadnom\r
-if(calendar.get(Calendar.DST_OFFSET) > 0){\r
- calendar.add(Calendar.HOUR_OF_DAY, 1);\r
-}\r
- \r
- OctopusObject oo = new OctopusObject();\r
- oo.id = o;\r
- //create events\r
- for(int e=0; e<6; e++){\r
- int rndMins = 15 + r.nextInt(60);\r
- OctopusEvent oe = new OctopusEvent();\r
-\r
- oe.systemName = "sys" + e + "_" + oo.id; //kulon nev minden object sorhoz\r
- oe.startTime = new Date(calendar.getTimeInMillis());\r
- //System.out.print("start time: " + sdf.format(new Date(calendar.getTimeInMillis()))); \r
- calendar.add(Calendar.MINUTE, rndMins);\r
- oe.endTime = new Date(calendar.getTimeInMillis());\r
- //System.out.println(" end time: " + sdf.format(new Date(calendar.getTimeInMillis()))); \r
-\r
- oo.eventList.add(oe);\r
- }\r
- ret.add(oo);\r
- }\r
- return ret;\r
- }\r
- \r
- \r
- class OctopusObject{\r
- public int id = 0;\r
- public List<OctopusEvent> eventList = new ArrayList<OctopusEvent>();\r
- }\r
- \r
- class OctopusEvent{\r
- public String systemName = null;\r
- public Date startTime = null;\r
- public Date endTime = null;\r
- \r
- }\r
- \r
- static private String getRNDColor(){\r
- Random rand = new Random();\r
- String ret = "";\r
- for(int c=0; c<3; c++){\r
- int myRandomNumber = rand.nextInt(0xFF);\r
- String part = Integer.toHexString(myRandomNumber);\r
- if(part.length() == 1) part = "0" + part;\r
- ret += part;\r
- }\r
- ret = "#"+ret;\r
- return ret.toUpperCase();\r
- }\r
-\r
- //rgba(0, 0, 0, 0.0)\r
-/* \r
- static private String getRGBARNDColor(){\r
- Random rand = new Random();\r
- String ret = "";\r
- for(int c=0; c<3; c++){\r
- int myRandomNumber = rand.nextInt(0xFF);\r
- String part = Integer.toHexString(myRandomNumber);\r
- if(part.length() == 1) part = "0" + part;\r
- ret += (part + ",");\r
- }\r
- ret = "rgba(" + ret + "0.5)";\r
- return ret.toUpperCase();\r
- }\r
-*/ \r
- \r
-}
\ No newline at end of file
--- /dev/null
+package user.jobengine.zk.model;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.zkoss.bind.annotation.AfterCompose;\r
+import org.zkoss.bind.annotation.Command;\r
+import org.zkoss.bind.annotation.ContextParam;\r
+import org.zkoss.bind.annotation.ContextType;\r
+import org.zkoss.bind.annotation.Init;\r
+import org.zkoss.chart.Point;\r
+import org.zkoss.chart.Series;\r
+import org.zkoss.zk.ui.Component;\r
+import org.zkoss.zk.ui.Executions;\r
+import org.zkoss.zk.ui.select.Selectors;\r
+import org.zkoss.zk.ui.select.annotation.Wire;\r
+import org.zkoss.zul.Window;\r
+\r
+import com.ibm.nosql.json.JSONUtil;\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+public class StatisticsDetailsModel extends BaseModel {\r
+ @Wire("#wnd")\r
+ private Window wnd;\r
+ private List<BasicDBObject> events;\r
+ private List<String> columnList = Arrays.asList("Touched", "Started", "Finished", "Tag", "Successful", "UserName", "Source", "Destination");\r
+ private BasicDBObject selectedEvent;\r
+\r
+ @AfterCompose\r
+ public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
+ Selectors.wireComponents(view, this, false);\r
+ Series series = (Series) Executions.getCurrent().getArg().get("series");\r
+ wnd.setTitle(series.getName());\r
+ Point selectedPoint = (Point) Executions.getCurrent().getArg().get("point");\r
+ selectedEvent = (BasicDBObject) JSONUtil.jsonToDbObject(selectedPoint.getName());\r
+ events = new ArrayList<>();\r
+ for (Point point : series.getData()) {\r
+ BasicDBObject obj = (BasicDBObject) JSONUtil.jsonToDbObject(point.getName());\r
+ events.add(obj);\r
+ }\r
+ }\r
+\r
+ @Command\r
+ public void close() {\r
+ wnd.detach();\r
+ }\r
+\r
+ public List<String> getColumnList() {\r
+ return columnList;\r
+ }\r
+\r
+ public List<BasicDBObject> getEvents() {\r
+ return events;\r
+ }\r
+\r
+ public BasicDBObject getSelectedEvent() {\r
+ return selectedEvent;\r
+ }\r
+\r
+ @Init\r
+ public void init() {\r
+ }\r
+\r
+ public boolean isSelected(BasicDBObject event) {\r
+ return event.equals(selectedEvent);\r
+ }\r
+\r
+ public void setColumnList(List<String> columnList) {\r
+ this.columnList = columnList;\r
+ }\r
+\r
+ public void setEvents(List<BasicDBObject> events) {\r
+ this.events = events;\r
+ }\r
+\r
+ public void setSelectedEvent(BasicDBObject selectedEvent) {\r
+ this.selectedEvent = selectedEvent;\r
+ }\r
+\r
+}
\ No newline at end of file
\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
+import org.zkoss.bind.annotation.AfterCompose;\r
+import org.zkoss.bind.annotation.ContextParam;\r
+import org.zkoss.bind.annotation.ContextType;\r
import org.zkoss.chart.AxisLabels;\r
import org.zkoss.chart.Charts;\r
import org.zkoss.chart.ChartsEvent;\r
import org.zkoss.chart.plotOptions.PlotOptions;\r
import org.zkoss.chart.plotOptions.SplinePlotOptions;\r
import org.zkoss.json.JavaScriptValue;\r
-import org.zkoss.zk.ui.select.SelectorComposer;\r
+import org.zkoss.zk.ui.Component;\r
+import org.zkoss.zk.ui.Executions;\r
+import org.zkoss.zk.ui.select.Selectors;\r
import org.zkoss.zk.ui.select.annotation.Listen;\r
import org.zkoss.zk.ui.select.annotation.Wire;\r
-import org.zkoss.zul.Datebox;\r
import org.zkoss.zul.Window;\r
\r
import com.ibm.nosql.json.api.BasicDBObject;\r
\r
import user.commons.CalendarUtils;\r
+import user.commons.ListUtils;\r
import user.jobengine.db.IItemManager;\r
import user.jobengine.db.WorkflowAction;\r
import user.jobengine.server.JobEngine;\r
+import user.jobengine.zk.model.MetadataTypeDetector.MetadataType;\r
\r
-@SuppressWarnings("serial")\r
-public class StatisticsComposer extends SelectorComposer<Window> {\r
+public class StatisticsModel {\r
private static final Logger logger = LogManager.getLogger();\r
private static final int XCOUNT = 60 * 24;\r
private static Map<String, Color> colors = new HashMap<>();\r
}\r
\r
private IItemManager itemManager = null;\r
-\r
- @Wire\r
- private Datebox chartDateSelector;\r
+ private Date selectedDate;\r
+ private int selectedType;\r
\r
@Wire\r
Charts chart;\r
\r
- public StatisticsComposer() {\r
+ public StatisticsModel() {\r
this.itemManager = JobEngine.getStaticItemManager();\r
}\r
\r
addPoint(series, x, y, data.toString(), color);\r
}\r
\r
- @Listen("onChange = #chartDateSelector")\r
- public void changeDate() {\r
- //ha elhgynánk a gombot\r
+ @AfterCompose\r
+ public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
+ Selectors.wireComponents(view, this, false);\r
+ Selectors.wireEventListeners(view, this);\r
+ setSelectedDate(new Date());\r
}\r
\r
private void clearChart() {\r
chart.getExporting().setEnabled(false);\r
\r
chart.setTitle("Anyagok élettörténete");\r
- chart.setSubtitle(CalendarUtils.toDateWithDayString(CalendarUtils.createCalendar(chartDateSelector.getValue()), new Locale("hu")));\r
+ chart.setSubtitle(CalendarUtils.toDateWithDayString(CalendarUtils.createCalendar(selectedDate), new Locale("hu")));\r
chart.getLegend().setEnabled(false);\r
- //chart.setWidth(1024);\r
PlotOptions plotOptions = chart.getPlotOptions();\r
plotOptions.getSeries().setAllowPointSelect(true);\r
SplinePlotOptions soptions = plotOptions.getSpline();\r
soptions.setCursor("pointer");\r
\r
Marker marker = soptions.getMarker();\r
- marker.setRadius(4);\r
+ marker.setRadius(3);\r
marker.setLineWidth(1);\r
marker.setSymbol("square");\r
- marker.setFillColor(new Color("black"));\r
-\r
- // Tooltip tooltip = chart.getTooltip();\r
- // tooltip.setHeaderFormat("");\r
- // tooltip.setFormat("");\r
- // tooltip.setPointFormat("");\r
- // tooltip.setUseHTML(true);\r
- // tooltip.setBorderWidth(0);\r
- // tooltip.addExtraAttr("formatter", new JavaScriptValue("function () { return statistics(this.point); }"));\r
-\r
- }\r
-\r
- @Override\r
- public void doAfterCompose(Window comp) throws Exception {\r
- super.doAfterCompose(comp);\r
- chartDateSelector.setValue(new Date());\r
- showChart();\r
}\r
\r
private int fillData(List<WorkflowAction> actions) {\r
Series series = null;\r
for (WorkflowAction action : actions) {\r
String houseId = action.getHouseId();\r
+\r
if (houseId == null)\r
continue;\r
+ if (selectedType == 0 && !MetadataType.OCTOPUS.equals(MetadataTypeDetector.GuessMetadataType(houseId)))\r
+ continue;\r
+\r
+ if (selectedType == 1 && !MetadataType.TRAFFIC.equals(MetadataTypeDetector.GuessMetadataType(houseId)))\r
+ continue;\r
+\r
if (houseId.equals(lastHouseId)) {\r
addPoint(series, action, result);\r
continue;\r
return result;\r
}\r
\r
+ public Date getSelectedDate() {\r
+ return selectedDate;\r
+ }\r
+\r
+ public int getSelectedType() {\r
+ return selectedType;\r
+ }\r
+\r
+ @Listen("onPlotSelect = #chart")\r
+ public void onPlotSelect(ChartsEvent event) {\r
+ Point point = event.getPoint();\r
+ point.setSelected(false);\r
+ Series series = event.getSeries();\r
+ String template = "/pages/statisticsdetails.zul";\r
+ Window window = (Window) Executions.createComponents(template, null, ListUtils.asMap("point", point, "series", series));\r
+ window.doModal();\r
+ }\r
+\r
+ public void setSelectedDate(Date selectedDate) {\r
+ this.selectedDate = selectedDate;\r
+ showChart();\r
+ }\r
+\r
+ public void setSelectedType(int selectedType) {\r
+ this.selectedType = selectedType;\r
+ showChart();\r
+ }\r
+\r
private void setupXAxis() {\r
XAxis xAxis = chart.getXAxis();\r
xAxis.setTickInterval(30);\r
yAxis.getLabels().addExtraAttr("formatter", new JavaScriptValue("function () { return statisticsYValue(this.value, this.chart.series); }"));\r
}\r
\r
- @Listen("onPlotSelect = #chart")\r
- public void shiftPoint(ChartsEvent event) {\r
- // retrieve the point object.\r
- Point point = event.getPoint();\r
- // shift the point by updating its x value.\r
- //point.setX(point.getX().intValue() + random() / 10);\r
- logger.info(point);\r
- }\r
-\r
- @Listen("onClick = #btnShowChart")\r
public void showChart() {\r
clearChart();\r
configureChart();\r
setupXAxis();\r
- List<WorkflowAction> actions = itemManager.getWorkflowActions(chartDateSelector.getValue());\r
+ List<WorkflowAction> actions = itemManager.getWorkflowActions(selectedDate);\r
if (actions == null || actions.size() == 0) {\r
setupYAxis(0);\r
return;\r