一.什么是报表

向上级报告情况的表格。简单的说:报表就是用表格、图表等格式来动态显示数据,可以用公式表示为:“报表 = 多样的格式 + 动态的数据”

  • 表格:详细数据
  • 图表: 直观

二.表格数据展示

2.1 准备了一 vo

报表中需的数据(准备的类)

public class PurchasebillitemVO {
//编号
private Long id;
//供应商
private String supplierName;
//采购员
private String buyerName;
//产品
private String productName;
//产品类型
private String productTypeName;
//日期
private Date vdate;
//数量
private BigDecimal num;
//单价
private BigDecimal price;
//小计
private BigDecimal amount;
//状态
private Integer status; //分组字段
private String groupField; public PurchasebillitemVO() {}
//创建时设置值
public PurchasebillitemVO(Purchasebillitem item,Integer groupBy) {
this.id = item.getId();
this.supplierName = item.getBill().getSupplier().getName();
this.buyerName = item.getBill().getBuyer().getUsername();
this.productName = item.getProduct().getName();
this.productTypeName = item.getProduct().getTypes().getName();
this.vdate = item.getBill().getVdate();
this.num = item.getNum();
this.price = item.getPrice();
this.amount = item.getAmount();
this.status = item.getBill().getStatus(); //确定分组字段
switch (groupBy){
case 1:{
this.groupField = this.buyerName;
break;
}
case 2:{
this.groupField = (DateUtils.toCalendar(this.vdate).get(Calendar.MONTH)+1) +"月份";
break;
}
default:
this.groupField =this.supplierName;
}
}
...
}

2.2 前端展示

easyui的一个扩展控制:groupview

2.2.1 引入相应的js支持

<script src="/easyui/plugins/datagrid-groupview.js"></script>

2.2.2 高级查询字段

<div id="tb" style="padding:5px;height:auto">
<!-- 这里就是一个日历 -->
<div id="cc" class="easyui-calendar"></div>
<form id="searchForm" method="post" action="">
采购时间: <input name="beginDate" class="easyui-datebox" data-options="sharedCalendar:'#cc'"
style="width:120px">
- <input name="endDate" class="easyui-datebox" data-options="sharedCalendar:'#cc'" style="width:120px">
状态:<select class="easyui-combobox" panelHeight="auto" name="status" style="width: 100px">
<option value="">--请选择--</option>
<option value="0">未审</option>
<option value="1">已审</option>
<option value="-1">作废</option>
</select>
<!-- 分组的条件 -->
<select class="easyui-combobox" panelHeight="auto" name="groupBy" style="width: 100px">
<option value="0">供应商</option>
<option value="1">采购员</option>
<option value="2">月份</option>
</select>
<a href="javascript:;" data-method="search" class="easyui-linkbutton" iconCls="icon-search">查询</a>
<a href="javascript:;" data-method="show3d" class="easyui-linkbutton" iconCls="icon-search">3D</a>
<a href="javascript:;" data-method="show2d" class="easyui-linkbutton" iconCls="icon-search">2D</a>
</form>
</div>
<table id="itemsGrid"></table>

2.2.3 案例进行修改

//创建分组grid
itemsGrid.datagrid({
//title:'',
// width:500,
// height:250,
fit:true,
rownumbers:true,
remoteSort:false,
nowrap:false,
fitColumns:true,
//url:'datagrid_data.json',
toolbar:"#tb",
url:'/purchasebillitem/findItems',
columns:[[
{field:'id',title:'编号',width:100,sortable:true},
{field:'supplierName',title:'供应商',width:100,sortable:true},
{field:'buyerName',title:'采购员',width:100,sortable:true},
{field:'productName',title:'产品',width:100,sortable:true},
{field:'productTypeName',title:'产品类型',width:100,sortable:true},
{field:'vdate',title:'采购日期',width:100,sortable:true},
{field:'num',title:'数量',width:100,sortable:true},
{field:'price',title:'价格',width:100,sortable:true},
{field:'amount',title:'小计',width:100,sortable:true},
{field:'status',title:'状态',width:100,sortable:true,formatter:statusFormat}
]],
groupField:'groupField', //指示要被分组的字段
view: groupview,
groupFormatter:function(value, rows){ //组格式化
let num = 0,amount = 0;
for(let r of rows){
num += r.num;
amount += r.amount;
}
return value + ' - ' + rows.length + '条数据 <span >共'+num+'条数据</span> <span >总金额:'+amount +"</span>";
}
});

三.图表展示

  • 两种技术:flash(actionscript),h5(画布)
  • flash缺点:不安全,容易崩溃
  • IE的话只能是flash的方式
  • 两个框架:highchart(收费,支持IE),echart(百度,开源免费)

3.1 前端使用

3.1.1 引入相应的js

<!-- 引入highcharts的js支持 -->
<script src="/js/plugin/highcharts/code/highcharts.js"></script>
<script src="/js/plugin/highcharts/code/highcharts-3d.js"></script>
<script src="/js/plugin/highcharts/code/modules/exporting.js"></script>
<script src="/js/plugin/highcharts/code/modules/export-data.js"></script>

3.1.2 弹出div进行展示

  1. 准备弹出来的
<!-- 一个弹出框,里面要装一个form表单 -->
<div id="chartDialog" class="easyui-dialog" title="图表展示"
data-options="height:400,width:600,closed:true,modal:true">
<div id="container" style="height: 320px"></div>
</div>
  1. 点击3D按钮弹出图表
show3d(){
chartDialog.dialog("center").dialog("open");
//拿到表单中的所有数据
var params = searchForm.serializeObject();
//通过Ajax到后台拿到相应的值[{name:xxx,y:10},]
$.post("/purchasebillitem/findCharts",params,function (data) {
//注意这里有一个异步问题
var chart = Highcharts.chart('container', {
chart: {
type: 'pie', //饼图
options3d: {
enabled: true,
alpha: 45,
beta: 0
}
},
title: {
text: '我是一个头'
},
tooltip: {
pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>'
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: 'pointer',
depth: 35,
dataLabels: {
enabled: true,
format: '{point.name}'
}
}
},
series: [{
type: 'pie',
name: '浏览器有',
data: data
}]
});
})
}

3.2 后台获取参数

1.修改query中的方法

// where o.bill.status = ? and o.xxx =? ...
//接收参数的变量
private List params = new ArrayList();
//准备一个方法,返回JPQL的查询条件
public String createWhereJPQL(){
StringBuilder jpql = new StringBuilder();
//开始时间
if(beginDate!=null){
jpql.append(" and o.bill.vdate >= ? ");
params.add(beginDate);
}
//结束时间
if(endDate!=null){
jpql.append(" and o.bill.vdate < ? ");
params.add(DateUtils.addDays(endDate, 1));
}
//状态
if(status!=null){
jpql.append(" and o.bill.status = ? ");
params.add(status);
}
//第一个条件必需是where开头
return jpql.toString().replaceFirst("and", "where");
}
//创建分组的JPQL
public String createGroupBy(){
String groupStr = "o.bill.supplier.name";
switch (groupBy){
case 1:{
groupStr="o.bill.buyer.username";
break;
}
case 2:{
groupStr="MONTH(o.bill.vdate)";
break;
}
}
return groupStr;
}

2.PurchasebillitemServiceImpl

/**
* 查询图表需要的数据
* @param query
*/
@Override
public List<Map> findCharts(PurchasebillitemQuery query){
List<Map> mapList = new ArrayList<>(); //拿到条件JPQL
String whereJPQL = query.createWhereJPQL();
//拿到条件对应的参数
List params = query.getParams();
//准备分组的条件
String groupBy = query.createGroupBy();
//根据供应商分组拿到的数据
String jpql = "select "+groupBy+",sum(o.amount) from Purchasebillitem o "+whereJPQL+" group by "+groupBy;
List<Object[]> list = findByJpql(jpql,params.toArray());
//需要把一个List<Object[]> -> List<Map>
for (Object[] objects : list) {
Map map = new HashMap();
map.put("name", objects[0]);
map.put("y", objects[1]);
mapList.add(map);
}
return mapList;
}

第二项目AIaisell(易销宝)的更多相关文章

  1. 后盾网lavarel视频项目---5、淘宝镜像cnpm的原理及如何使用

    后盾网lavarel视频项目---5.淘宝镜像cnpm的原理及如何使用 一.总结 一句话总结: 原理:把npm上面的所有软件copy过来 使用:npm install -g cnpm --regist ...

  2. 新浪网易淘宝等IP地区信息查询开放API接口调用方法

    通过IP地址获取对应的地区信息通常有两种方法:1)自己写程序,解析IP对应的地区信息,需要数据库.2)根据第三方提供的API查询获取地区信息. 第一种方法,参见文本<通过纯真IP数据库获取IP地 ...

  3. spring boot的一个小项目小型进销存系统

    项目所需的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  4. Python爬虫项目--爬取某宝男装信息

    本次爬取用到的知识点有: 1. selenium 2. pymysql 3  pyquery 正文 1. 分析目标网站 1. 打开某宝首页, 输入"男装"后点击"搜索&q ...

  5. 【UI】为项目添加类似于淘宝筛选列表勾选的ui-choose

    jQuery下载的地址:http://www.htmleaf.com/jQuery/Form/201512182916.html GitHub地址:https://github.com/wangxin ...

  6. 车销宝无线开单PDA 一款互联网+POS神器 无缝与电脑数据同步 无线POS开单解决方案

    1.无线POS开单解决方案是基于后台系统开发的一套系统,它实现了采购入库退货.销售出库退货.盘点调拨等功能. 2.系统通过(WIFI.GPRS.GSM.蓝牙)实时后台库存.客户.商品.价格跟踪等信息, ...

  7. iOS中 项目开发易错知识点总结

    点击return取消textView 的响应者 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [_contactTextFiled  ...

  8. iOS中 项目开发易错知识点总结 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 点击return取消textView 的响应者 - (BOOL)textFieldShouldReturn:(UI ...

  9. 项目文章|DNA(羟)甲基化研究揭示铁离子依赖表观调控促进狼疮致病性T细胞分化|易基因

    易基因(羟)甲基化DNA免疫共沉淀测序(h)MeDIP-seq研究成果见刊<Journal of Clinical Investigation> 2022年5月2日,中南大学湘雅二医院赵明 ...

随机推荐

  1. Java基础--常见计算机编码类型

    计算机编码指电脑内部代表字母或数字的方式,常见的编码方式有:ASCII编码,GB2312编码(简体中文),GBK,BIG5编码(繁体中文),ANSI编码,Unicode,UTF-8编码等. 1.ASC ...

  2. k8s网络之Calico网络

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Calico 是一种容器之间互通的网络方案.在虚拟化平台中,比如 Open ...

  3. 非阻塞读和写:str_cli函数

    void str_cli(FILE *fp, int sockfd) { int maxfdp1, val, stdineof; ssize_t n, nwritten; fd_set rset, w ...

  4. BSON数据格式

    BSON https://baike.baidu.com/item/BSON 概念 编辑 BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌 ...

  5. idea中pom.xml添加了新的maven依赖,点击import changes没反应

    打开file,setting. 选择Build,Execution,Deployment -> Build Tools -> Maven. 修改maven home directory为自 ...

  6. Linux学习之用户身份与文件权限

    Linux学习之用户身份与文件权限 1 用户身份及能力 Linux系统的管理员之所以是root,并不是因为其名叫root,而是该用户身份号码数值(UID)为0. 管理员UID为0:系统的管理员用户 系 ...

  7. 01.QT初学--两个窗口相互切换

    //qqwidget.cpp #include "qqwidget.h" #include "ui_qqwidget.h" qqwidget::qqwidget ...

  8. Standford NLP study

    Homepage https://stanfordnlp.github.io/CoreNLP/index.html Source Code: https://github.com/stanfordnl ...

  9. SqlServer如何获取存储过程的返回值

    1.Output参数返回值 1 CREATE PROCEDURE [dbo].[upInformation]( 2 @age int , 3 @id bigint OUTPUT 4 ) 5 AS 6 ...

  10. vue.nextTick简单的用法

    官方文档: 自己写了一个小demo: <template> <div> <p ref="txt" v-if="show">{ ...