社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
2019.6.24著
告诉大家一个好消息 ,今天朕终于要开始些功能了,哈哈哈!!!!虽然只是简单的查询,但是也是一次挑战,干巴爹哦嘞。
做一个报表,要求如下
1.显示会员基本信息
这个最简单啦,在后端写跳转页面的入口,把数据查出来存入request,在页面使用${“key的值”}取出来即可展示,最终效果如下:
2.折线图展示
折线图是我最后一个做的,因为比较难,前台代码也看不懂,不过做完之后发现其实也就那样,照着套就好了,看看大佬是怎么封装对象的 ,我跟着一样封装,然后吧前台代码复制粘贴,就实现功能了 ,不过在这期间也出现过bug,我把int类型的数据用String传到前端了,结果前端调试有数据,但是页面显示就是不出数据。下次要吸取教训。
3.饼状图展示
这个比较简单,页面上就一个div,然后坐在jq里面传入固定的json就可以了,具体后端代码如下:
/**
* 向页面发送饼状图json数据
* @param request
* @return
*/
@ResponseBody
@RequestMapping(value = {"/loadContentStat"}, method = {RequestMethod.GET})
public String loadContentStat(HttpServletRequest request) {
//C端用户总数
RetDTO customerType0 = customerWebApi.getCustomerType(CustomerDTO.CUSTOMER_CUSTOMERTYPE_ORDINARY);
int customerCCount = JSON.parseObject(customerType0.getRetData(), Integer.class);
//非C端用户总数
int noCustomerCCount = JSON.parseObject(customerWebApi.getCustomerType(CustomerDTO.CUSTOMER_CUSTOMERTYPE_ENTERPRISE).getRetData(), Integer.class)
+ JSON.parseObject(customerWebApi.getCustomerType(CustomerDTO.CUSTOMER_CUSTOMERTYPE_STAFF).getRetData(), Integer.class)
+ JSON.parseObject(customerWebApi.getCustomerType(CustomerDTO.CUSTOMER_CUSTOMERTYPE_SERVICE).getRetData(), Integer.class)
+ JSON.parseObject(customerWebApi.getCustomerType(CustomerDTO.CUSTOMER_CUSTOMERTYPE_ENGINEER).getRetData(), Integer.class)
+ JSON.parseObject(customerWebApi.getCustomerType(CustomerDTO.CUSTOMER_CUSTOMERTYPE_WHOLESALER).getRetData(), Integer.class);
Map<String, Object> returnMap = new HashMap<String, Object>();
List<Map<String, Object>> listData = new ArrayList<Map<String, Object>>();
List<String> categoryNameList = new ArrayList<String>();
categoryNameList.add("C端用户总数");
categoryNameList.add("非C端用户总数");
List<Integer> cList = new ArrayList();
cList.add(customerCCount);
cList.add(noCustomerCCount);
for (int i = 0; i < cList.size(); i++) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("name",categoryNameList.get(i));
paramMap.put("value",cList.get(i));
listData.add(paramMap);
}
returnMap.put("listData", listData);
returnMap.put("categoryNameList", categoryNameList);
return JSON.toJSONString(returnMap, SerializerFeature.WriteMapNullValue);
}
具体实现效果如下:
4.导出报表(包括会员表,订单表,地址表等)
这个的话就有点复杂了,查询代码特多 ,我就不一一写查询代码了,都用方法代替,具体逻辑展示如下:
/**
* 报表导出
* 根据条件导出数据
*
* @param response
* @param request
* @return
*/
@ResponseBody
@RequestMapping(value = {"/exportsByCondition"}, method = {RequestMethod.GET}, produces = {"text/html;charset=UTF-8"})
public String exportsByCondition(HttpServletResponse response, HttpServletRequest request) {
//获取开始时间
String startDate = request.getParameter("startDate");
//获取结束时间
String endDate = request.getParameter("endDate");
//1.获取EXCEL表头
String[] headers = {"登陆账号", "会员昵称", "会员类型", "手机号码", "邮箱", "注册时间", "最后登陆时间", "支付总金额", "支付次数", "加入分销员日期", "默认收货人", "默认收货手机号", "默认收货地址", "分公司编码", "分公司名称", "办事处编码", "办事处名称"};
//2.获取导出需要的数据
List<Map<String, String>> dataset = new ArrayList<Map<String, String>>();
RetDTO loginLogData = this.loginLogData(startDate, endDate);
List<CustomerLoginLogDTO> dataList = JSON.parseArray(loginLogData.getRetData(), CustomerLoginLogDTO.class);
System.out.println("------------------查询时间内的登陆数:"+dataList.size()+"-------------------");
//去重复
Set set = new HashSet();
//组装查询条件
for (CustomerLoginLogDTO customerLoginLogDTO : dataList) {
//使用set去重判断
if (set.add(customerLoginLogDTO.getCustomerUuid())) {
//组装查询条件
Map<String, String> map = new HashMap<String, String>();
String customerUuid = customerLoginLogDTO.getCustomerUuid();
//根据会员id查询customer表
RetDTO customerRetDTO = customerWebApi.getByUuid(customerUuid);
CustomerDTO customerDTO = null;
if (RetDTO.SUCCESS.equals(customerRetDTO.getRetStatus()) && StringUtils.isNotEmpty(customerRetDTO.getRetData())) {
customerDTO = JSON.parseObject(customerRetDTO.getRetData(), CustomerDTO.class);
if (customerDTO != null) {
map.put("key0", customerDTO.getCustomerNo());//登陆账号customerNo
map.put("key1", customerDTO.getCustomerName());//会员昵称customerName
map.put("key2", customerDTO.getCustomerType());//会员类型customerType
map.put("key3", customerDTO.getMobile());//手机号码mobile
map.put("key4", customerDTO.getEmail());//邮箱email
map.put("key5", customerDTO.getCreateTime());//注册时间createTime
map.put("key6", customerDTO.getLastLoginTime());//最后登陆时间lastLoginTime
} else {
map.put("key0", "");//登陆账号customerNo
map.put("key1", "");//会员昵称customerName
map.put("key2", "");//会员类型customerType
map.put("key3", "");//手机号码mobile
map.put("key4", "");//邮箱email
map.put("key5", "");//注册时间createTime
map.put("key6", "");//最后登陆时间lastLoginTime
}
}
//根据会员id查询order_main表
RetDTO orderMainListDto = this.getOrderMainByTimeData(startDate, endDate, customerUuid);
List<OrderMainDTO> orderMainList = JSON.parseArray(orderMainListDto.getRetData(), OrderMainDTO.class);
if (orderMainList != null && orderMainList.size() > 0) {
double payTotalMoney = 0.00;
int payNumber = 0;
for (OrderMainDTO orderMainDTO : orderMainList) {
payTotalMoney += orderMainDTO.getPayPrice();
payNumber++;
map.put("key7", payTotalMoney + "");//支付总金额payTotalMoney
map.put("key8", payNumber + "");//支付次数payNumber
}
} else {
map.put("key7", "");//支付总金额payTotalMoney
map.put("key8", "");//支付次数payNumber
}
if (customerDTO != null) {
map.put("key9", customerDTO.getExtendApplyTime());//joinDistributorTime加入分销员日期
} else {
map.put("key9", "");//joinDistributorTime加入分销员日期
}
//根据会员id查询customer_address表
RetDTO customerAddressRetDTO = customerAddressWebApi.getDefaultDeliveryAddress(customerUuid);
CustomerAddressDTO customerAddressDTO = JSON.parseObject(customerAddressRetDTO.getRetData(), CustomerAddressDTO.class);
if (customerAddressDTO != null) {
map.put("key10", customerAddressDTO.getConsignee());//默认收货人consignee
map.put("key11", customerAddressDTO.getTelephone());//默认手机号telephone
map.put("key12", customerAddressDTO.getAddress());//默认收货地址address
} else {
map.put("key10", "");//默认收货人consignee
map.put("key11", "");//默认手机号telephone
map.put("key12", "");//默认收货地址address
}
//根据分公司编码和办事处编码查询
if (customerDTO != null) {
if (CustomerDTO.CUSTOMER_CUSTOMERTYPE_SERVICE.equals(customerDTO.getCustomerType()) || CustomerDTO.CUSTOMER_CUSTOMERTYPE_ENGINEER.equals(customerDTO.getCustomerType())) {
RetDTO companyDto = partCompany4OthersApi.getByCode(customerDTO.getCompanyCode());
PartCompanyDTO company = JSON.parseObject(companyDto.getRetData(), PartCompanyDTO.class);
if (company != null && company != null) {
map.put("key13", company.getCompanyCode());//分公司编码companyNo,编码在会员表就有
map.put("key14", company.getCompanyName());//分公司名称companyName
} else {
map.put("key13", "");//分公司编码companyNo,编码在会员表就有
map.put("key14", "");//分公司名称companyName
}
RetDTO orgDto = organization4OthersApi.getbyCode(customerDTO.getAgencyCode());
OrganizationDTO org = JSON.parseObject(orgDto.getRetData(), OrganizationDTO.class);
if (org != null) {
map.put("key15", org.getOfficeCode());//办事处编码orgNo,编码在会员表就有
map.put("key16", org.getOrgName());//办事处名称orgName
} else {
map.put("key15", "");//办事处编码orgNo,编码在会员表就有
map.put("key16", "");//办事处名称orgName
}
} else {
map.put("key13", "");//分公司编码companyNo,编码在会员表就有
map.put("key14", "");//分公司名称companyName
map.put("key15", "");//办事处编码orgNo,编码在会员表就有
map.put("key16", "");//办事处名称orgName
}
} else {
map.put("key13", "");//分公司编码companyNo,编码在会员表就有
map.put("key14", "");//分公司名称companyName
map.put("key15", "");//办事处编码orgNo,编码在会员表就有
map.put("key16", "");//办事处名称orgName
}
dataset.add(map);//根据时间查询出来的数据
}
}
if (dataset != null && dataset.size() > 0) {
ExcelUtil.exportsDataByMap(dataset, response, "会员信息表", headers);
}
System.out.println("------------------导出报表会员信息条数:" + dataset.size() + "-----------------------------");
//3.导出数据
return "true";
}
表格到处就有点烦了,数据一多,就出问题 ,当我设置只要一千条的时候,他就很快。目前还不知道是什么原因,如果哪位大佬能看出来,希望能交流交流。
1.在写代码时,一定要记得修改过后及时编译。如果在方法外写了代码,这是必须重启项目才能生效
2.list集合的去重方式
//方法一:使用java8新特性stream进行List去重
List newList = list.stream().distinct().collect(Collectors.toList());
//方法二:双重for循环去重
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size(); j++) {
if(i!=j&&list.get(i)==list.get(j)) {
list.remove(list.get(j));
}
}
}
//方法三:set集合判断去重,不打乱顺序
Set set1 = new HashSet();
List newList1 = new ArrayList();
for (Integer integer : list) {
if(set1.add(integer)) {
newList1.add(integer);
}
}
//方法四:遍历后判断赋给另一个list集合
List newList2 = new ArrayList();
for (Integer integer : list) {
if(!newList2.contains(integer)){
newList2.add(integer);
}
}
//方法五:set和list转换去重
Set set2 = new HashSet();
List newList3 = new ArrayList();
set2.addAll(list);
newList3.addAll(set2);
总结:站在巨人的肩膀就能决定你初始的高度有多高,抄别人的代码不是丑事,最重要的是你做完了之后要会理解别人是怎么做的,然后吸收总结,把它变成自己的知识,这样你就成长了。整整一个星期才把这四个功能做完,第一次做是有点菜,代码写得也不漂亮,相信下次写我肯定能做好。
落款人:熊熊。2019.7.1
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!