Java全栈开发---Java ERP系统开发:商业ERP(十)销售统计
发布日期:2021-06-29 15:03:00 浏览次数:3 分类:技术文章

本文共 14234 字,大约阅读时间需要 47 分钟。

一、销售统计(报表)

1、需求以及实现思路

(1)需求

统计各类别的商品销售额,如下表

在这里插入图片描述

2、实现思路

技术:运用关联查询、聚合统计。

关键是SQL编写。
找出涉及的表有哪些?
报表数据存在哪个表里?
数据存在的表之间的中间表
查询条件所在的表
关联查询条件所在的表 和 数据所在的表之间 的中间表

销售额来源:订单明细表

商品类别: 商品类别表
关联用的表:商品表
条件类型为销售订单: 订单表

3、查询语句编写, 由简单到复杂

1)先将这4个表关联起来查询

关联查询,分组聚合

关键是编写SQL语句
(1)存在在哪些表当中(goodstype,orderdetail.money)
(2)中间表的关系(goods)
(3)找出条件所在的表(Orders.createtime)
(4)关联表如果没有,应该找其他的表进行关联:
库存表:goodstype,storeuuid,
中间表:goods
明细里:goodsuuid,money,storeuuid,

2)销售报表SQL编写

分三步来写

a、把所有相关的表,关联查询,查询goodstype表goods表orderdetail 表orders 表,其中商品类型goodstype的编号和商品goods的商品类型编号相同同时,底单详情的商品编号和商品的编号相同,订单编号和订单详情的订单编号相同
select * from goodstype gt,goods gs,orderdetail ol,orders owhere gt.uuid=gs.goodstypeuuid and ol.goodsuuid = gs.uuid and o.uuid = ol.ordersuuid
b、在上述SQL的基础上添加条件,并且订单类是出库的订单
select * from goodstype gt,goods gs,orderdetail ol,orders owhere gt.uuid=gs.goodstypeuuid and ol.goodsuuid = gs.uuid and o.uuid = ol.ordersuuidand o.type = '2'
c、进行分组统计

安装商品类型的名称分组,先商品类型的名称以及 对应的每个商品类型的订单总计价格

select gt.name,sum(ol.money) from goodstype gt,goods gs,orderdetail ol,orders owhere gt.uuid=gs.goodstypeuuid and ol.goodsuuid = gs.uuid and o.uuid = ol.ordersuuidand o.type = '2'group by gt.name

4、销售报表后端

(1)编写dao,在erp_dao下的com.itzheng.erp.dao当中创建接口IRepportDao ,以及对应的实现类ReportDao
package com.itzheng.erp.dao;import java.util.List;/* * 报表数据访问接口 */public interface IRepportDao {
/* * 销售统计报表 */ List ordersReport();}
package com.itzheng.erp.dao.impl;import java.util.List;import org.springframework.orm.hibernate5.support.HibernateDaoSupport;import com.itzheng.erp.dao.IRepportDao;public class ReportDao extends HibernateDaoSupport implements IRepportDao {
@Override public List ordersReport() {
String hql = "select gt.name,sum(ol.money) " + " from goodstype gt,goods gs,orderdetail ol,orders o " + "where gt.uuid=gs.goodstypeuuid " + "and ol.goodsuuid = gs.uuid " + "and o.uuid = ol.ordersuuid " + "and o.type = '2' " + "group by gt.name "; return getHibernateTemplate().find(hql); }}
(2)在erp_biz当中的com.itzheng.erp.biz创建IReportBiz接口,以及ReportBiz实现类
package com.itzheng.erp.biz;import java.util.List;public interface IReportBiz {
/* * 销售统计报表 */ List ordersReport();}
package com.itzheng.erp.biz.impl;import java.util.List;import com.itzheng.erp.biz.IReportBiz;import com.itzheng.erp.dao.IRepportDao;public class ReportBiz implements IReportBiz {
private IRepportDao reportDao; public void setReportDao(IRepportDao reportDao) {
this.reportDao = reportDao; } /* * 销售统计报表 */ @Override public List ordersReport() {
// TODO Auto-generated method stub return reportDao.ordersReport(); }}
(3)在erp_web当中的创建当中ReportAction
/* * 报表的Action */public class ReportAction {
private IReportBiz reportBiz; /* * 销售统计报表 */ public void setReportBiz(IReportBiz reportBiz) {
this.reportBiz = reportBiz; } public void orderReport() {
List list = reportBiz.ordersReport(); write(JSON.toJSONString(list)); } /** * 输出字符串 * * @param jsonString */ public void write(String jsonString) {
HttpServletResponse response = ServletActionContext.getResponse(); response.setCharacterEncoding("UTF-8"); try {
response.getWriter().print(jsonString); } catch (IOException e) {
// TODO Auto-generated catch block e.printStackTrace(); } }}
(4)添加上诉所有的配置文件
a、resources/applicationContext_dao.xml当中
b、resources/applicationContext_biz.xml
c、applicationContext_action.xml
d、struts.xml
(5)修改完以上的内依旧不能运行,将SQL转换为HQL

原生SQL与HQL的区别:

a、不能直接用表名、用类名、首字母大写
b、多的一方订单属性=1的一方的别名

package com.itzheng.erp.dao.impl;import java.util.List;import org.springframework.orm.hibernate5.support.HibernateDaoSupport;import com.itzheng.erp.dao.IRepportDao;public class ReportDao extends HibernateDaoSupport implements IRepportDao {	@Override	public List ordersReport() {		String hql = "select new Map(gt.name as name ,sum(ol.money) as y) "				+ " from Goodstype gt,Goods gs,Orderdetail ol,Orders o "				+ "where "				+ "gs.goodstype=gt "				+ "and ol.orders = o "				+ "and ol.goodsuuid = gs.uuid "				+ "and o.type = '2' "				+ "group by gt.name ";				return getHibernateTemplate().find(hql);	}}

访问测试

在这里插入图片描述

5、销售报表前端

(1)创建report_order.html
Insert title here
开始日期:
截止日期:
(2)创建report.js
$(function() {
// 表格数据初始化 $('#grid').datagrid({
url:'report_orderReport', columns : [[ {
field:'name',title:'商品类型',width:100}, {
field:'y',title:'销售额',width:100}, ]], singleSelect : true }); // 条件查询 $('#btnSearch').bind('click', function() {
var formdata = $('#searchForm').serializeJSON(); $('#grid').datagrid('load', formdata); });});

6、销售报表_实现日期查询

(1)修改IRepportDao和ReportDao
package com.itzheng.erp.dao;import java.util.Date;import java.util.List;/* * 报表数据访问接口 */public interface IRepportDao {
/* * 销售统计报表 */ List ordersReport(Date startDate,Date endDate);}
package com.itzheng.erp.dao.impl;import java.util.Date;import java.util.List;import org.springframework.orm.hibernate5.support.HibernateDaoSupport;import com.itzheng.erp.dao.IRepportDao;public class ReportDao extends HibernateDaoSupport implements IRepportDao {
@Override public List ordersReport(Date startDate,Date endDate) {
String hql = "select new Map(gt.name as name ,sum(ol.money) as y) " + " from Goodstype gt,Goods gs,Orderdetail ol,Orders o " + "where " + "gs.goodstype=gt " + "and ol.orders = o " + "and ol.goodsuuid = gs.uuid " + "and o.type = '2' " + "group by gt.name "; return getHibernateTemplate().find(hql); }}
(2)修改IReportBiz和ReportBiz
package com.itzheng.erp.biz;import java.util.Date;import java.util.List;/* * 报表的业务接口 */public interface IReportBiz {
/* * 销售统计报表 */ List ordersReport(Date startDate,Date endDate);}

在这里插入图片描述

(3)修改ReportAction,添加startDate和endDate属性以及对应的set方法

在这里插入图片描述

package com.itzheng.erp.action;import java.io.IOException;import java.util.Date;import java.util.List;import javax.servlet.http.HttpServletResponse;import org.apache.struts2.ServletActionContext;import com.alibaba.fastjson.JSON;import com.itzheng.erp.biz.IReportBiz;/* * 报表的Action */public class ReportAction {
private IReportBiz reportBiz; private Date startDate; private Date endDate; public void setStartDate(Date startDate) {
this.startDate = startDate; } public void setEndDate(Date endDate) {
this.endDate = endDate; } /* * 销售统计报表 */ public void setReportBiz(IReportBiz reportBiz) {
this.reportBiz = reportBiz; } public void orderReport() {
List list = reportBiz.ordersReport(startDate,endDate); write(JSON.toJSONString(list)); } /** * 输出字符串 * * @param jsonString */ public void write(String jsonString) {
HttpServletResponse response = ServletActionContext.getResponse(); response.setCharacterEncoding("UTF-8"); try {
response.getWriter().print(jsonString); } catch (IOException e) {
// TODO Auto-generated catch block e.printStackTrace(); } }}
(4)修改report_order.html和report.js

在这里插入图片描述

$(function() {
// 表格数据初始化 $('#grid').datagrid({
url:'report_orderReport', columns : [[ {
field:'name',title:'商品类型',width:100}, {
field:'y',title:'销售额',width:100}, ]], singleSelect : true }); // 条件查询 $('#btnSearch').bind('click', function() {
var formdata = $('#searchForm').serializeJSON(); if(formdata.endDate != ''){
formdata+= "23:59:59" } $('#grid').datagrid('load', formdata); });});
(5)修改ReportDao
package com.itzheng.erp.dao.impl;import java.util.ArrayList;import java.util.Date;import java.util.List;import org.springframework.orm.hibernate5.support.HibernateDaoSupport;import com.itzheng.erp.dao.IRepportDao;public class ReportDao extends HibernateDaoSupport implements IRepportDao {
@Override public List ordersReport(Date startDate,Date endDate) {
String hql = "select new Map(gt.name as name ,sum(ol.money) as y) " + " from Goodstype gt,Goods gs,Orderdetail ol,Orders o " + "where " + "gs.goodstype=gt " + "and ol.orders = o " + "and ol.goodsuuid = gs.uuid " + "and o.type = '2' "; List
dateList = new ArrayList
(); if(startDate != null) {
hql += "and o.createtime >= ? "; dateList.add(startDate); } if(endDate != null) {
hql += "and o.createtime <= ? "; dateList.add(endDate); } hql += "group by gt.name "; return getHibernateTemplate().find(hql,dateList.toArray(new Date[]{
})); }}

运行测试

在这里插入图片描述

7、销售报表_数组转换,修改ReportDao

在这里插入图片描述

二、销售统计(图表工具)

1、JFreeChart(Java)

JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。

入门demo
在 D 盘根目录生成饼图图片 chart.png
在 D 盘根目录生成饼图图片 chart.png

1)创建JfreeChartDemo工程,创建Maven progect

在这里插入图片描述

2)引入相关jar包

在这里插入图片描述

在这里插入图片描述

3)创建类

在这里插入图片描述

4)JFreeCharDemo当中创建main方法并创建DefaultPieDataset对象,向该对象当中设置对应的值
package com.itzheng.demo;import java.io.File;import java.io.IOException;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartUtilities;import org.jfree.chart.JFreeChart;import org.jfree.data.general.DefaultPieDataset;public class JFreeCharDemo {
public static void main(String[] args) throws IOException {
DefaultPieDataset dataSet = new DefaultPieDataset(); //设置数据集 dataSet.setValue("家电", 10086); dataSet.setValue("百货", 9527); dataSet .setValue("食品", 110110); //参数1:title = 图标的标题 //参数2:PieDataset = 数据集(这里是dataSet) //参数3:true = 设置是否显示下标题(legend) //参数4:toopltip:鼠标移动过去的提示 //参数5:url是否为超链接 JFreeChart chart = ChartFactory.createPieChart("标题",dataSet,true,false,false); //保存到本地目录下 //参数1:文件名称,本地的目录 //参数2:图标对象 //参数3:图标的宽度 //参数4:图标的高度 ChartUtilities.saveChartAsPNG(new File("d:\\pie.png"), chart, 500, 500); }}

运行上诉程序

在这里插入图片描述
成功创建图表
在这里插入图片描述

2、Highcharts (JavaScript)

Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习、个人网站和非商业用途使用。

HighCharts支持的图表类型有曲线图、区域图、柱状图、饼状图、散状点图和综合图表。

HighCharts 界面美观,由于使用JavaScript编写,所以不需要像Flash和Java那样需要插件才可以运行,而且运行速度快。

另外HighCharts还有很好的兼容性,能够完美支持当前大多数浏览器
我们的ERP项目就采用HighCharts

(1)入门Demo,hightchart的实例
1)创建report_order.html,并引入report.js
Insert title here
开始日期:
截止日期:
2)将highchars.js 拷贝到ui文件夹,并在页面 report_order.html 中引入highchars.js
3)将exporting.js 拷贝到ui文件夹,并在页面 report_order.html 中引入exporting.js
4)创建report.js
$(function() {
// 表格数据初始化 $('#grid').datagrid({
url:'report_orderReport', columns : [[ {
field:'name',title:'商品类型',width:100}, {
field:'y',title:'销售额',width:100}, ]], singleSelect : true, onLoadSuccess:function(data){
//alert(JSON.stringify(data)); //显示图 showChart(data.rows); } }); //点击查询按钮 $('#btnSearch').bind('click',function(){
//把表单数据转换成json对象 var formdata = $('#searchForm').serializeJSON(); if(formdata.endDate != ''){
formdata.endDate += " 23:59:59"; } $('#grid').datagrid('load',formdata); });});//显示图function showChart(_data){
// Build the chart $('#pieChart').highcharts({
chart: {
plotBackgroundColor: null, plotBorderWidth: null, plotShadow: false, type: 'pie' }, title: {
text: '销售统计' }, tooltip: {
pointFormat:'{series.name}: {point.percentage:.1f}%' }, plotOptions:{
pie:{
allowPointSelect: true, cursor: 'pointer', dataLabels: {
enabled: true }, showInLegend: true } }, series: [{
name: "比例", colorByPoint: true, data: _data }] });}
6)运行测试

在这里插入图片描述

(2)hightchars配置介绍

API官网:

在这里插入图片描述

三、销售趋势分析

1、需求

选择年份点击查询,可以看到所选择年份的各个月份的销售额的统计数据

在这里插入图片描述

2、后端实现

(1)编写测试SQL语句
--销售趋势select ol.*,o.createtime from orderdetail ol,orders owhere o.uuid = ol.ordersuuidand o.type = '2';
(2)修改IRepportDao和ReportDao

在这里插入图片描述

在这里插入图片描述

(3)修改IReportBiz和ReportBiz

在这里插入图片描述

在ReportBiz当中的getSumMoney方法当中进行差缺补漏

在这里插入图片描述
对应解析
在这里插入图片描述

(4) ReportAction

在这里插入图片描述

3、前端实现

(1)创建report_trend.html
销售趋势报表
年份:
(2)创建json文件夹

在这里插入图片描述

(3)创建report_trend.js
$(function() {
// 表格数据初始化 $('#grid').datagrid({
queryParams:{
}, columns : [[ {
field:'name',title:'月份',width:100}, {
field:'y',title:'销售额',width:100}, ]], singleSelect : true, onLoadSuccess:function(data){
//alert(JSON.stringify(data)); //显示图 //showChart(data.rows); } }); //点击查询按钮 $('#btnSearch').bind('click',function(){
//把表单数据转换成json对象 var formdata = $('#searchForm').serializeJSON(); $('#grid').datagrid('load',formdata); $('#grid').datagrid({
url:'report_trendReport', queryParams:formdata }); });});

测试

在这里插入图片描述

(4)添加趋势图(修改report_trend.js)
$(function() {
// 表格数据初始化 $('#grid').datagrid({
queryParams:{
}, columns : [[ {
field:'name',title:'月份',width:100}, {
field:'y',title:'销售额',width:100}, ]], singleSelect : true, onLoadSuccess:function(data){
//alert(JSON.stringify(data)); //显示图 //showChart(data.rows); showChart(); } }); //点击查询按钮 $('#btnSearch').bind('click',function(){
//把表单数据转换成json对象 var formdata = $('#searchForm').serializeJSON(); $('#grid').datagrid('load',formdata); $('#grid').datagrid({
url:'report_trendReport', queryParams:formdata }); });});function showChart(){
var months = new Array(); for(var i = 1; i <= 12; i++){
months.push(i + "月"); } $('#trendChart').highcharts({
title: {
text:$('#year').combobox('getValue') + "年销售趋势分析", x: -20 //center }, subtitle: {
text: 'Source: www.itzheng.com', x: -20 }, xAxis: {
categories: months }, yAxis: {
title: {
text: '销售额' }, plotLines: [{
value: 0, width: 1, color: '#808080' }] }, tooltip: {
valueSuffix: '元' }, legend: {
layout: 'vertical', align: 'center', verticalAlign: 'bottom', borderWidth: 0 }, series: [{
name: '销售趋势', data: $('#grid').datagrid('getRows') }] });}

在这里插入图片描述

测试
在这里插入图片描述

4、将销售趋势挂到菜单上,修改MENU表

在这里插入图片描述

5、测试

在这里插入图片描述

转载地址:https://code100.blog.csdn.net/article/details/109783512 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java多线程(案例+解析)进阶部分:线程安全懒汉模式,线程锁死问题
下一篇:Java全栈开发---Java ERP系统开发:商业ERP(九)销售订单

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月13日 04时34分24秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

物联网 20 年简史大揭秘! 2019-04-29
开源项目|RT-Thread 软件包应用作品:水墨屏桌面台历 2019-04-29
珠联璧合!基于i.MX RT和RT-Thread的物联网云接入方案 2019-04-29
基于RTT-MicroPython制作自带BGM的新型肺炎晴雨表 2019-04-29
Arm宣布推出Cortex-M55核心和Ethos-U55 microNPU,瞄准低功耗Edge AI 2019-04-29
开源项目|RT-Thread 软件包应用作品:小闹钟 2019-04-29
在 RT-Thread Studio 上使用 RT-Thread Nano 2019-04-29
开源项目|软件包应用作品:通用物联网系统平台 2019-04-29
【经验分享】RT-Thread UART设备驱动框架初体验(中断方式接收带\r\n的数据) 2019-04-29
单片机里面的CPU使用率是什么鬼? 2019-04-29
推荐一个优质Linux技术公众号-作者都是一线Linux代码贡献者们哦 2019-04-29
RT-Thread 编程风格指南 2019-04-29
95后高校电子教师,软硬兼修有趣有料! 2019-04-29
使用 STM32 通用 Bootloader ,让 OTA 更加 Easy 2019-04-29
Cache 的基本概念与工作原理 2019-04-29
装机量超亿台 RISC-V +IoT OS!中科蓝讯与RT-Thread战略合作,共推自主物联网生态发展 2019-04-29
Android程序员必备!面试一路绿灯Offer拿到手软,Android面试题及解析 2019-04-29
Android程序员的春天!12个View绘制流程高频面试题,分享PDF高清版 2019-04-29
深入交流安卓!新鲜出炉的Android面试真题集锦我给你们整理出来了!Android面试题及解析 2019-04-29
深入浅出Android开发!你会的还只有初级工程师的技术吗?一线互联网公司面经总结 2019-04-29