На основе приведенного ниже набора результатов я создал диаграмму стека столбцов. Они были преобразованы в список объектов с 4 атрибутами (называемый SKUQtyMetric - все строки, кроме Quantity as Integer)
При преобразовании этого в стековую диаграмму я не мог заставить второй элемент отображаться рядом с первым элементом в каждом из x-тиков (X представляет час). Если я не ошибаюсь, должно быть только четыре объекта DataSeries, каждый из которых представляет выход, а затем выполняет внутренний цикл. Как примечание, каждая розетка обозначается цветом, даже если есть более одного элемента (я сохраняю ограничение в три элемента, которые можно выбрать для поиска в базе данных), поэтому ниже приведен код outletFromH .
Текущий рендеринг кода (с использованием Vaadin Charts 4) выглядит следующим образом:
Map<String, Set<String>> myMaps = new HashMap<String, Set<String>>();
for (SkuQtyMetric item : objList) {
if (!myMaps.containsKey(item.getOutletName())) {
myMaps.put(item.getOutletName(), new HashSet<String>());
}
myMaps.get(item.getOutletName()).add(item.getItemName());
}
String asgnColor = "#ffcccc";
for(Map.Entry<String, Set<String>> map: myMaps.entrySet()) {
DataSeries dataSeries = new DataSeries(map.getKey()+"");
PlotOptionsColumn plotOptions = new PlotOptionsColumn();
plotOptions.setStacking(Stacking.NORMAL);
DataLabels labels = new DataLabels(true);
Style style = new Style();
style.setFontSize("9px");
style.setTextShadow("0 0 3px black");
labels.setStyle(style);
labels.setColor(new SolidColor("white"));
plotOptions.setDataLabels(labels);
ls.add(dataSeries);
for(String itemName: map.getValue()) {
System.out.println("Inside " + map.getKey() + ", value is: " + itemName);
dataSeries.setId(itemName);
for(SkuQtyMetric metric : objList) {
for (Map.Entry<String, String> outletfromH : Constant.SYCARDA_COLOR.entrySet()) {
if (outletfromH.getKey().equalsIgnoreCase(map.getKey())) {
asgnColor = outletfromH.getValue();
}
}
System.out.println("DataSeries Id: " + dataSeries.getId() + " , Item metric name is: "+metric.getItemName());
if(dataSeries.getName().equalsIgnoreCase(metric.getOutletName())) {
if(dataSeries.getId().equalsIgnoreCase(metric.getItemName())) {
DataSeriesItem dataSeriesItem = new DataSeriesItem(xFor(metric.getHourNumber()), metric.getQuantityAmt());
dataSeriesItem.setId(metric.getItemName()+"_setSeriesId");
dataSeriesItem.setColor(new SolidColor(asgnColor));
dataSeries.setStack(metric.getItemName());
plotOptions.setColor(new SolidColor(asgnColor));
dataSeries.setPlotOptions(plotOptions);
dataSeries.add(dataSeriesItem);
}
}
}
}
}
for (int j = 0; j < ls.size(); j++) {
listSeries.add(ls.get(j));
}
chart.getConfiguration().getSubTitle().setText(subpageName);
chart.getConfiguration().setSeries(listSeries);
При рендеринге я мог получить только такой результат:
Это текущая диаграмма, но второй элемент (кокосовая вода) отсутствует, он показан красными строчками. Что я не уверен, так это то, что мой класс карты ИЛИ мои контролируемые объекты списка неверны, ИЛИ может быть, что должно быть восемь, а не четыре DataSeries (каждый из которых является выходом и продуктом). Если нет, есть ли более эффективный способ обработки кода для визуализации диаграммы, чем то, что я делаю прямо сейчас?