java一些有用的代码(折线图场景)

场景一,前端页面需要展示近7天,近30天,近x天的数据
java一些有用的代码(折线图场景)
文章图片

数据库里面带着开始时间和结束时间去查数据的时候,(前端只给7/10x需要自己拼凑开始和结束时间)不是每一天都有数据,例如8.5是0,数据库是没有记录的,这时候需要补齐没有的数据,为0也要给前端。即给到前端的数据格式为list。list里面应该有7个元素。数据库可能只有5个或者3个元素,剩余的需要补齐。
思路:1,计算出是要几天的数据这个值前端会传过来days,即返回集合list的大小
2,数据库查出来的dbList的sizes()不等于days的时候就需要补齐。
3,补齐的关键点在于,datTime即20200805相同,所以利用这点灵活运用map。
具体代码如下:
// 查询折线图起止时间内的点击数据
public ReqResult findPage(AdMatStaRespQueryForm form) {
ReqResult result = ReqResult.newInstance(false, PageResp.class);
try {
List listResp = new ArrayList();
// 分页查询机构+广告位+图片类型维度下的素材ID
PageResp page = AdMaterialStatisticService.getInstance().findMaterialIdsByPage(form.toAdMatStatQueryPageForm());
List materialIds = page.getList();
AdMaterialStaticCountType countType = AdMaterialStaticCountType.valueOf(form.getCountType());
int days = countType.getDays();
// 查询每个素材的历史点击总量
materialIds.forEach(materialId -> {
AdMaterialStaticResp resp = AdMaterialStatisticService.getInstance().getByCond(form.setMaterialId(materialId));
// 获取折线图起止时间
AdMatStaQueryForm queryForm = buildQueryForm(form.setMaterialId(materialId), days);
// 查询折线图起止时间内的点击数据
List adMaterialStatistics = AdMaterialStatisticService.getInstance().findByCond(queryForm);
List dayList = adMaterialStatistics;
// 折线图数据集合不够统计天数量,补齐
if (adMaterialStatistics.size() != days) {
DateTimeHelper dateTimeHelper = DateTimeHelper.getInstance();
Map map = new HashedMap<>();
dayList = new ArrayList();
for (AdMaterialStatistic adMaStatistic : adMaterialStatistics) {
map.put(adMaStatistic.getDayTime(), adMaStatistic);
}
for (int i = 1; i <= days; i++) {
long time = dateTimeHelper.getTodayStartLocalDateTimePreDays(i);
String dayTime = dateTimeHelper.strFormat(dateTimeHelper.toInstant(time), DateTimeHelper.DATE_FORMAT);
AdMaterialStatistic adMaterialStatistic = map.get(dayTime);
adMaterialStatistic = adMaterialStatistic == null
? AdMaterialStatistic.newInstance().setDayTime(dayTime)
: adMaterialStatistic;
dayList.add(adMaterialStatistic);
}
}
// 组装实体
resp.setAdMaterialStatistics(dayList).setStartDay(queryForm.getStartDay())
.setEndDay(queryForm.getEndDay());
listResp.add(resp);
});
PageResp pageResp = PageResp.newInstance();
FastBeanCopyer.getInstance().copy(page, pageResp);
pageResp.setList(listResp);
result.setTarget(pageResp);
result.setSuccess(true);
} catch (Exception e) {
final String logId = "AdMaterialStatisticHandler[findPage]";
final String reason = LogHelper.getInstance().exceptionReason(form);
ExceptionInfo exceptionInfo = ExceptionInfo.newInstance().withLogModule(logModule).withLogId(logId)
.withReason(reason).withResult(result);
HandlerExceptionHelper.getInstance().handleException(exceptionInfo, e);
}
return result;
}

场景二:前端不是传近x日。而是随意上传一个开始时间和结束时间,(时间戳类型)去查询某起止时间段内的折线图


java一些有用的代码(折线图场景)
文章图片

【java一些有用的代码(折线图场景)】不同点在于,补齐数据的时候 循环的次数不一样了。场景一循环的次数是可以知道的,而此场景需要把开始的时间作为一个变量放到循环里面去。具体代码如下:
public List getMgmResults(MgmConf mgmConf, MgmAccRstQueryForm form) {
List results = new ArrayList();
AssertUtil.getInstance().checkException(StringUtils.isBlank(form.getStartDay()), "请选择开始时间");
AssertUtil.getInstance().checkException(StringUtils.isBlank(form.getEndDay()), "请选择结束时间");
// 查询推荐办卡成效
RcmmResultQueryForm rcmmRstForm = RcmmResultQueryForm.newInstance().setCmAvyId(mgmConf.getCmAvyID())
.setEndDay(form.getEndDay()).setStartDay(form.getStartDay()).setStdType(mgmConf.getHandleStandard());
List rcmmResults = RcmmResultService.getInstance().findByCond(rcmmRstForm);
// 查询活动页面访问成效
List mgmResults = MgmAccessResultService.getInstance().findByCond(form);
// 推荐办卡成效Map<日期,成效>
Map rcmmRstMap = new HashMap();
for (RcmmResult rcmmResult : rcmmResults) {
rcmmRstMap.put(rcmmResult.getStatsDate(), rcmmResult);
}
// 活动页面访问成效Map<日期,成效>
Map mgmRstMap = new HashMap();
for (MgmResult mgmResult : mgmResults) {
mgmRstMap.put(mgmResult.getStatsDate(), mgmResult);
}
// 从开始时间开始 一直往后推一天 直到结束时间为止
LocalDate endDate = DateTimeHelper.getInstance().str2LocalDate(MgmResultHelper.DATE_FORMAT, form.getEndDay());
LocalDate curDate = DateTimeHelper.getInstance().str2LocalDate(MgmResultHelper.DATE_FORMAT, form.getStartDay());
long curTm = DateTimeHelper.getInstance().toInstant(curDate).toEpochMilli();
long endTm = DateTimeHelper.getInstance().toInstant(endDate).toEpochMilli();
for (; curTm <= endTm; ) {
String key = DateTimeHelper.getInstance().strFormat(curDate, DATE_FORMAT);
RcmmResult rcmmResult = rcmmRstMap.get(key);
MgmResult mgmResult = mgmRstMap.get(key);
if (mgmResult == null) {
mgmResult = MgmResult.newInstance().setCmAvyId(mgmConf.getCmAvyID()).setStatsDate(key).setPv(0).setUv(0);
}
mgmResult.setStdNum(rcmmResult == null ? 0 : rcmmResult.getStdNum()).setStdType(mgmConf.getHandleStandard());
results.add(mgmResult);
curDate = curDate.plusDays(1);
curTm = DateTimeHelper.getInstance().toInstant(curDate).toEpochMilli();
}
return results;
}


    推荐阅读