前端的写法,用的freemark的加载方式。
$(function () {
//控件初始化 main是div的ID
worldMapContainer = document.getElementById('main');
resizeWorldMapContainer = function () {
worldMapContainer.style.width = window.innerWidth-300 + 'px';
worldMapContainer.style.height = 400 + 'px';
};
ReportControl();
});
function ReportControl(){
//设置容器高宽
resizeWorldMapContainer();
myChart = echarts.init(worldMapContainer);
//参数设置
var option = {
title: {text: '这个是标题'},
tooltip: {trigger: 'axis'},
legend: {data: []},
toolbox: {feature: {saveAsImage: {}}},
grid: {
left: '2%',
right: '3%',
bottom: '2%',
containLabel: true
},
xAxis: [
{
type: 'category',
boundaryGap: false,
data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
}
],
yAxis: [
{
type: 'value'
}
],
series: [
<#list firstList as info>
<#if !info_has_next>
{
name: '${info}',
type: 'line',
stack: '${info}',
areaStyle: {normal: {}},
data: [0, 0, 0, 0, 0, 0, 0]
}
<#else>
{
name: '${info}',
type: 'line',
stack: '${info}',
areaStyle: {normal: {}},
data: [0, 0, 0, 0, 0, 0, 0]
},
</#if>
</#list>
]
};
myChart.setOption(option); //参数设置方法
myChart.hideLoading();
getChartData('7', '','','firstList');//ajax后台交互
window.onresize = function () {
//重置容器高宽
resizeWorldMapContainer();
myChart.resize();
};
}
function getChartData(lastDay, startTime, endTime,divCode) {
var url="${basePath}/activityStatement/getStatisticalStatement";
//获得图表的options对象
var options = myChart.getOption();
//通过Ajax获取数据
$.ajax({
type: "POST",
async: false, //同步执行
url: url,
data: {"lastDay": lastDay, "startTime": startTime, "endTime": endTime,"divCode":divCode},
dataType: "json", //返回数据形式为json
success: function (result) {
if (result) {
options.legend.data = result.dataTitle;
options.xAxis[0].data = result.dateString;
options.series = result.series;
myChart.hideLoading();
myChart.setOption(options, true);
}
},
error: function (errorMsg) {
console.log(errorMsg);
myChart.hideLoading();
}
});
}
后台代码
package com.oruit.app.web.action;
import com.oruit.app.data.source.DbContextHolder;
import com.oruit.app.service.ActivityStatementService;
import com.oruit.app.util.DateUtil;
import com.oruit.app.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* Created by xuzhen on 8/13/19.
* 活动报表
*/
@Controller
@RequestMapping("activityStatement")
public class ActivityStatementAction {
@Autowired
private ActivityStatementService activityStatementService;
//首次收徒奖励
static List<String> firstList = new ArrayList<>();
//第二轮收徒奖励
static List<String> secondList = new ArrayList<>();
//第三轮收徒奖励
static List<String> thirdList = new ArrayList<>();
//用户抽奖总收入
static List<String> totalDrawIncomeList = new ArrayList<>();
//总抽奖人数
static List<String> totalDrawNumberList = new ArrayList<>();
//获得抽奖机会人数
static List<String> opportunityList = new ArrayList<>();
//中奖数据(页面加载再初始化)
static List<String> winningDataList = new ArrayList();
static List<String> winningViewList = new ArrayList();
static String divCodeStatic = "";
static {
firstList.add("拜师用户");
firstList.add("收徒首次奖励次数");
secondList.add("拜师用户");
secondList.add("第二轮礼包发放数");
thirdList.add("拜师用户");
thirdList.add("第三轮礼包发放数");
totalDrawIncomeList.add("抽奖总次数");
totalDrawIncomeList.add("抽奖总金额");
totalDrawNumberList.add("可抽奖总人数");
totalDrawNumberList.add("参与抽奖人数");
opportunityList.add("获得机会人数");
}
/**
* 活动报表
*
* @param request
* @param model
* @return
*/
@RequestMapping("/activityStatementReport")
public String activityStatementReport(HttpServletRequest request, Model model) {
DbContextHolder.setDbType("dataRead"); //切换数据源到统计库
//模块id
String moduleid = request.getParameter("moduleid");
model.addAttribute("moduleid", moduleid);
//表格初始化
//firstList secondList thirdList 使用 apprenticeDiv
model.addAttribute("firstList", firstList);
//totalDrawIncomeList totalDrawNumberList使用 luckdrawDiv1
model.addAttribute("totalDrawIncomeList", totalDrawIncomeList);
//opportunityList 使用luckdrawDiv2
model.addAttribute("opportunityList", opportunityList);
//winningDataList 使用luckdrawDiv3 页面加载再初始化动态表头
winningDataList = activityStatementService.getWinningDataList();
winningViewList = activityStatementService.getWinningViewList();
model.addAttribute("winningDataList", winningDataList);
return "report/activityStatement-report";
}
@RequestMapping("getStatisticalStatement")
@ResponseBody
public Object getStatisticalStatement(HttpServletRequest request, Model model) throws Exception {
DbContextHolder.setDbType("analysis"); //切换数据源到统计库
//返回总数据
Map<String, Object> data = new HashMap<>();
//用于查询的集合数据
Map<String, Object> params = new HashMap<>();
//返回数据头
List<String> dataTitle = new ArrayList<>();
//返回数据集合
List<List<Integer>> datalist = new ArrayList<>();
Integer lastDay = null;
String lastDayString = request.getParameter("lastDay");
if (!StringUtils.isEmpty(lastDayString)) {
lastDay = Integer.parseInt(lastDayString);
}
String startTime = request.getParameter("startTime");
String endTime = request.getParameter("endTime");
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date start = null;
Date end = null;
List<Date> dateList = null;
if (lastDay != null) { //选中过去多少天
String seven = DateUtil.getYesterday(lastDay); //得到过去多少天的时间
String yesterday = DateUtil.getYesterday(1);
start = sdf.parse(seven);
end = sdf.parse(yesterday);
dateList = DateUtil.dateSplit(start, end); //获取两个日期之间的日期
} else { //自选时间
start = sdf.parse(startTime);
end = sdf.parse(endTime);
dateList = DateUtil.dateSplit(start, end);
}
Collections.reverse(dateList); //使用Reverse方法可以根据元素的自然顺序 对指定列表按降序进行排序。
List<String> dateString = new ArrayList<>();
for (Date date : dateList) {
dateString.add(sdf.format(date));
}
params.put("startTime", start);
params.put("endTime", end);
model.addAttribute("startTime", startTime);
model.addAttribute("endTime", endTime);
//调用过来需要获取的数据
String divCode = request.getParameter("divCode");
if (StringUtils.isEmpty(divCode)) {
if (StringUtils.isEmpty(divCodeStatic)) {
divCodeStatic = "firstList";
}
divCode = divCodeStatic;
} else {
divCodeStatic = divCode;
}
if ("firstList".equals(divCode)) {
dataTitle = firstList;
datalist = activityStatementService.getFirstListDiv(params, dateString);
} else if ("secondList".equals(divCode)) {
dataTitle = secondList;
datalist = activityStatementService.getSecondListDiv(params, dateString);
} else if ("thirdList".equals(divCode)) {
dataTitle = thirdList;
datalist = activityStatementService.getThirdListDiv(params, dateString);
} else if ("totalDrawIncomeList".equals(divCode)) {
dataTitle = totalDrawIncomeList;
datalist = activityStatementService.getTotalDrawIncomeListDiv(params, dateString);
} else if ("totalDrawNumberList".equals(divCode)) {
dataTitle = totalDrawNumberList;
datalist = activityStatementService.getTotalDrawNumberListDiv(params, dateString);
} else if ("opportunityList".equals(divCode)) {
dataTitle = opportunityList;
datalist = activityStatementService.getOpportunityListDiv(params, dateString);
} else if ("winningDataList".equals(divCode)) {
dataTitle = winningDataList;
datalist = activityStatementService.getWinningDataListDiv(params, dateString, winningViewList.toArray(new String[winningViewList.size()]));
}
//列表表头重构
List<Map<String, Object>> series = new ArrayList<>();
for (int i = 0; i < dataTitle.size(); i++) {
Map<String, Object> item = new HashMap<>();
item.put("name", dataTitle.get(i));
item.put("type", "line");
item.put("stack", dataTitle.get(i));
//这个是数据
item.put("data", datalist.get(i));
series.add(item);
}
data.put("series", series);
//时间
data.put("dateString", dateString);
//标题
data.put("dataTitle", dataTitle);
return data;
}
}
service ,getDataList方法提供的是获取 每天一行数据,数据对应字段名显示
package com.oruit.app.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.oruit.app.common.cache.MemcacheUtil;
import com.oruit.app.dao.AnalysisApprenticeStatMapper;
import com.oruit.app.dao.AnalysisLotteryDrawStatMapper;
import com.oruit.app.service.ActivityStatementService;
import com.oruit.app.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created by xuzhen on 8/13/19.
*/
@Service
public class ActivityStatementServiceImpl implements ActivityStatementService {
@Autowired
private AnalysisApprenticeStatMapper analysisApprenticeStatMapper;
@Autowired
private AnalysisLotteryDrawStatMapper analysisLotteryDrawStatMapper;
@Override
public List<String> getWinningDataList() {
List<String> winningDataList = analysisLotteryDrawStatMapper.getWinningDataList();
List<String> list = new ArrayList<>();
for (String data : winningDataList) {
list.add(data + "金币次数");
list.add(data + "金币中奖(百分比)");
}
list.add("参与抽奖次数");
return list;
}
@Override
public List<String> getWinningViewList() {
return analysisLotteryDrawStatMapper.getWinningDataList();
}
@Override
public List<List<Integer>> getFirstListDiv(Map<String, Object> params, List<String> dateString) {
List<Map<String, Object>> list = analysisApprenticeStatMapper.queryData(params);
String[] viewArr = new String[]{"user_num", "first_reward_num"};
return getDataList(dateString, list, viewArr);
}
@Override
public List<List<Integer>> getSecondListDiv(Map<String, Object> params, List<String> dateString) {
List<Map<String, Object>> list = analysisApprenticeStatMapper.queryData(params);
String[] viewArr = new String[]{"user_num", "second_reward_num"};
return getDataList(dateString, list, viewArr);
}
@Override
public List<List<Integer>> getThirdListDiv(Map<String, Object> params, List<String> dateString) {
List<Map<String, Object>> list = analysisApprenticeStatMapper.queryData(params);
String[] viewArr = new String[]{"user_num", "third_reward_num"};
return getDataList(dateString, list, viewArr);
}
@Override
public List<List<Integer>> getTotalDrawIncomeListDiv(Map<String, Object> params, List<String> dateString) {
List<Map<String, Object>> list = analysisApprenticeStatMapper.queryData(params);
String[] viewArr = new String[]{"lottery_draw_num", "lottery_draw_gold"};
return getDataList(dateString, list, viewArr);
}
@Override
public List<List<Integer>> getTotalDrawNumberListDiv(Map<String, Object> params, List<String> dateString) {
List<Map<String, Object>> list = analysisApprenticeStatMapper.queryData(params);
String[] viewArr = new String[]{"lottery_draw_user_total", "join_lottery_draw_user_num"};
return getDataList(dateString, list, viewArr);
}
@Override
public List<List<Integer>> getOpportunityListDiv(Map<String, Object> params, List<String> dateString) {
List<Map<String, Object>> list = analysisApprenticeStatMapper.queryData(params);
String[] viewArr = new String[]{"get_lottery_draw_user_num"};
return getDataList(dateString, list, viewArr);
}
@Override
public List<List<Integer>> getWinningDataListDiv(Map<String, Object> params, List<String> dateString, String[] viewArr) {
List<List<Integer>> datalist = new ArrayList<>();
MemcacheUtil memcacheUtil = MemcacheUtil.getInstance();
Object memcachelist = memcacheUtil.cacheGet("ActivityStatementService_getWinningDataListDiv");
if (StringUtils.isEmpty(memcachelist + "")) {
//读取缓存
datalist = JSONObject.parseObject(memcachelist.toString(), List.class);
return datalist;
}
//首次数据
String firstDate = dateString.get(0);
for (String date : dateString) {
List<Map<String, Object>> list = analysisLotteryDrawStatMapper.queryData(date);
Integer toDayNum = analysisLotteryDrawStatMapper.queryToDayNum(date);
for (int i = 0; i < viewArr.length; i++) {
//对应头数据(默认没有)
boolean noDayHava = true;
for (Map<String, Object> item : list) {
if (viewArr[i].equals(item.get("title"))) {
noDayHava = false;
Integer gold = Integer.parseInt(item.get("title").toString());
Integer num = Integer.parseInt(item.get("num").toString());
if (firstDate.equals(date)) {
//金币次数
List<Integer> rowlist = new ArrayList<>();
rowlist.add(num);
datalist.add(rowlist);
//中奖励百分比
rowlist = new ArrayList<>();
rowlist.add(num * 100 / toDayNum);
datalist.add(rowlist);
} else {
datalist.get(i * 2).add(num);
datalist.get(i * 2 + 1).add(num * 100 / toDayNum);
}
break;
}
}
if (noDayHava) {
if (firstDate.equals(date)) {
List<Integer> rowlist = new ArrayList<>();
rowlist.add(0);
//有两列数据,加两次
datalist.add(rowlist);
rowlist = new ArrayList<>();
rowlist.add(0);
datalist.add(rowlist);
} else {
datalist.get(i * 2).add(0);
datalist.get(i * 2 + 1).add(0);
}
}
}
if (firstDate.equals(date)) {
List<Integer> rowlist = new ArrayList<>();
rowlist.add(toDayNum);
datalist.add(rowlist);
} else {
datalist.get(viewArr.length * 2).add(toDayNum);
}
}
memcacheUtil.cacheSet("ActivityStatementService_getWinningDataListDiv", 60, JSON.toJSONString(memcachelist));
return datalist;
}
/**
* 返回数据集合
*
* @param dateString 时间格式
* @param list 数据集
* @param viewArr 对应Key
* @return
*/
public List<List<Integer>> getDataList(List<String> dateString, List<Map<String, Object>> list, String[] viewArr) {
List<List<Integer>> datalist = new ArrayList<>();
for (String date : dateString) {
//没有当天数据
boolean noDayHava = true;
for (Map<String, Object> item : list) {
if (date.equals(item.get("statdates"))) {
//获取到某天的数据
noDayHava = false;
if (datalist.size() == 0) {
List<Integer> rowlist = new ArrayList<>();
for (int i = 0; i < viewArr.length; i++) {
rowlist.add(Integer.parseInt(item.get(viewArr[i]).toString()));
}
datalist.add(rowlist);
} else {
for (int i = 0; i < viewArr.length; i++) {
datalist.get(i).add(Integer.parseInt(item.get(viewArr[i]).toString()));
}
}
continue;
}
}
//没有当天数据全部默认0
if (noDayHava) {
if (datalist.size() == 0) {
//这里代表首次就没得
for (int i = 0; i < viewArr.length; i++) {
List<Integer> rowlist = new ArrayList<>();
rowlist.add(0);
datalist.add(rowlist);
}
} else {
for (List<Integer> data : datalist) {
data.add(0);
}
}
}
}
return datalist;
}
}