Java生鲜电商平台-系统报表设计与架构
Java生鲜电商平台-系统报表设计与架构
说明:任何一个运行的平台都需要一个很清楚的报表来显示,那么作为Java开源生鲜电商平台而言,我们应该如何设计报表呢?或者说我们希望报表来看到什么数据呢?
通过报表我们可以分析出目前整个公司的运营情况,以及下一步的调整方向,这样更加有理有据的掌握整个市场与决策。
设计基础维度:
1. 今日订单,今日营业额,总订单数,总营业额
2. 今日的注册买家,总的注册买家。
3. 实时的营收,实时的下单买家。
4. 今日下单买家,空降A(空降A指的是今天注册同时下单的客户)
数据的力量在于清楚的明白的告诉整个系统运营人员,昨天我们的销售团队创造了多少的业绩,以及整个趋势是怎么样的,今天的努力方向是怎么样的,昨天的所获是怎么样的
如何进行一起努力与学习。
业务分析: 今日订单,今日营业额,总订单数,总营业额等来源于订单表以及订单汇总表。鉴于数据量并不是很大,所以可以实时的进行查询。
如果存在数据量过大,比如订单表我们有100w的数量,那么可以采用定时器在规定的时间内进行执行,然后把统计结果放在统计表中
统计表的系统设计如下:
CREATE TABLE `report_days` (
`id` bigint(20) DEFAULT NULL,
`order_number_count` int(11) DEFAULT NULL COMMENT '今日订单数',
`order_rmb_count` decimal(12,2) DEFAULT NULL COMMENT '今日营业额',
`order_number_amount` int(11) DEFAULT NULL COMMENT '总订单数',
`order_rmb_amount` decimal(12,2) DEFAULT NULL COMMENT '总营业额',
`create_time` datetime DEFAULT NULL COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='每日报表';
说明:其实就是向这里面进行数据的更新与增加操作即可,每天进行报表的读取与显示
不过有些网友提出采用缓存来处理,我个人的意见是不需要。数据也没那么多,而且都是定时器来执行,缓存的价值与意义很小。
相关的执行代码如下:


@Component
public class TaskReport { private static final Logger logger=LoggerFactory.getLogger(TaskReport.class); @Autowired
private BuyerOrderReportService buyerOrderReportService; @Autowired
private ReportDayService reportDayService; @Autowired
private BillService billService;
/**
* 计算每天报表;
* 每日上午6:00触发
*/
@Scheduled(cron="0 0 6 * * ?")
protected void day(){
try{
logger.info("TaskReport.day.start");
//统计每天订单报表;
Integer today = 0;//0表示今天 1表示昨天;
reportDayService.insertBatch(today);
//统计买家每日订单金额;
buyerOrderReportService.insertBatch(today);
}catch(Exception e){
logger.error("TaskReport.day.exception",e);
}finally {
logger.info("TaskReport.day.end");
}
}
2. 相关的报表的形状显示,目前折线图,柱状图是比较理想的一种方式,采用百度的echarts进行显示
相关的运行实例如下:



补充说明:相关的echarts的用法,这边就不列举了,的确蛮简单的,返回json给echarts所需要的数据格式即可。
代码这里只贴出相对核心的代码:
public class IndexController extends BaseController {
    private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
    @Autowired
    private OrderInfoService orderInfoService;
    @Autowired
    private OrderItemService orderItemService;
    @Autowired
    private SalesService salesService;
    @Autowired
    private BuyerService buyerService;
    @Autowired
    private SellerService sellerService;
    @Autowired
    private ReportedService reportedService;
    @RequestMapping(value = "/index", method = { RequestMethod.GET, RequestMethod.POST })
    public String index(HttpServletRequest request, HttpServletResponse response, Model model, Long areaId) {
        logger.info("[IndexController][index] :查询订单统计数据");
        try {
            // 查询订单总数量和金额
            Map<String, Object> totalMap = orderInfoService.getCountAndAmount();
            int totalCount = (int) totalMap.get("count");
            BigDecimal totalAmount = (BigDecimal) totalMap.get("amount");
            if (totalAmount == null) {
                totalAmount = BigDecimal.ZERO;
            }
            // 查询今日的订单总数量和金额
            Map<String, Object> todayMap = orderInfoService.getOrderCountAndAmountByToday();
            int todayOrderCount = (int) todayMap.get("count");
            BigDecimal todayOrderAmount = (BigDecimal) todayMap.get("amount");
            if (todayOrderAmount == null) {
                todayOrderAmount = BigDecimal.ZERO;
            }
            // 查询实时的订单总数量和金额
            Map<String, Object> realTimeRevenueMap = orderInfoService.getRealTimeRevenueCount();
            int realTimeOrderCount = (int) realTimeRevenueMap.get("count");
            BigDecimal realTimeOrderAmount = (BigDecimal) realTimeRevenueMap.get("amount");
            if (realTimeOrderAmount == null) {
                realTimeOrderAmount = BigDecimal.ZERO;
            }
            // 入驻买家数量
            int totalBuyerCount = buyerService.getBuyerCount(null);
            // 当日注册买家数量
            int todayBuyercount = buyerService.getDailyBuyerCount();
            // 当日入驻卖家数量
            int todaySellerCount = sellerService.getDailySellerCount();
            model.addAttribute("totalCount", totalCount);
            model.addAttribute("totalAmount", totalAmount);
            model.addAttribute("todayOrderCount", todayOrderCount);
            model.addAttribute("todayOrderAmount", todayOrderAmount);
            model.addAttribute("totalBuyerCount", totalBuyerCount);
            model.addAttribute("todayBuyercount", todayBuyercount);
            model.addAttribute("todaySellerCount", todaySellerCount);
            model.addAttribute("realTimeOrderAmount", realTimeOrderAmount);
            model.addAttribute("realTimeOrderCount", realTimeOrderCount);
            // 查询今儿下单买家数量和空降A;
            int order_buyerCount = orderInfoService.getBuyerCountByTodayOrder();
            int newBuyerNum = orderInfoService.getBuyerNumByThatDay();
            model.addAttribute("order_buyerCount", order_buyerCount);
            model.addAttribute("newBuyerNum", newBuyerNum);
            Reported reported = new Reported();
            reported.setrSolveStatus(1);
            int count = reportedService.getCount(reported);
            model.addAttribute("count", count);
        } catch (Exception ex) {
            logger.error("[IndexController][index] :exception", ex);
        }
        return "index";
    }
3.对于卖家而言,我们的报表需要有以下几个维度来统计(统计最新的TOP的卖家)
3.1 买家消费。
3. 2 卖家收入
3.3 热卖的菜品
3.4 销售业绩
3. 5 订单项最多的买家。

这里面也是些统计的数据,相对而言跟上面的买家维度差不多,代码方面也类似,无外乎需要的是多点数据库的查询与统计即可。
总结:其实整个报表的设计与实现过程并不难,难的是你为什么要这样设计,你通过这个运营的后台给整个项目的运营能够带来怎么样的用户体验与指导,
你需要通过数据来诊断这个销售团队过程中是否存在什么问题。有没什么刷单以及其他的作弊嫌疑在里面。
最后:很多人说系统功能很强大很好,但是我的一种思维方式是不一定,强大固然好,但是你需要通过这么多的系统数据中来分析出问题的关键,而不是所谓的代码堆积。
你所需要的是思考,再思考,最终思考。
Java生鲜电商平台-系统报表设计与架构的更多相关文章
- Java生鲜电商平台-库存管理设计与架构
		
Java生鲜电商平台-库存管理设计与架构 WMS的功能: 1.业务批次管理 该功能提供完善的物料批次信息.批次管理设置.批号编码规则设置.日常业务处理.报表查询,以及库存管理等综合批次管理功能,使企业 ...
 - Java生鲜电商平台-商品价格的设计与架构
		
Java生鲜电商平台-商品价格的设计与架构 说明:Java开源生鲜电商平台-商品价格的设计与架构,主要是对商品的价格进行研究与系统架构. 一.常见的电商价格 市场价(List Price):这个价格仅 ...
 - Java生鲜电商平台-服务器部署设计与架构
		
Java生鲜电商平台-服务器部署设计与架构 补充说明:Java开源生鲜电商平台-服务器部署设计与架构,指的是通过服务器正式上线整个项目,进行正式的运营. 回顾整个章节,我们涉及到以下几个方面: 1. ...
 - Java开源生鲜电商平台-监控模块的设计与架构(源码可下载)
		
Java开源生鲜电商平台-监控模块的设计与架构(源码可下载) 说明:Java开源生鲜电商平台-监控模块的设计与架构,我们谈到监控,一般设计到两个方面的内容: 1. 服务器本身的监控.(比如:linux ...
 - Java开源生鲜电商平台-通知模块设计与架构(源码可下载)
		
Java开源生鲜电商平台-通知模块设计与架构(源码可下载) 说明:对于一个生鲜的B2B平台而言,通知对于我们实际的运营而言来讲分为三种方式: 1. 消息推送:(采用极光推送) ...
 - Java生鲜电商平台-系统异常状态的设计与架构(APP应用或者生鲜小程序)
		
Java生鲜电商平台-系统异常状态的设计与架构 说明:在实际开发Java生鲜电商平台的时候,异常状态的设计关系着整体系统的性能问题,架构设计,以及稳定性方面,对此,我根据实际的业务场景,进行了系统设计 ...
 - Java生鲜电商平台-商城优惠券设计要点复盘与总结
		
Java生鲜电商平台-商城优惠券设计要点复盘与总结 Java生鲜电商平台本文将从优惠券设计用户端,需求端,业务流程全方案解析优惠券设计方案 为什么要设计优惠券 设计优惠券的核心:拉新和促活 新产品上线 ...
 - Java生鲜电商平台-订单配送模块的架构与设计
		
Java生鲜电商平台-订单配送模块的架构与设计 生鲜电商系统最终的目的还是用户下单支付购买, 所以订单管理系统是电商系统中最为复杂的系统,其作为中枢决定着整个商城的运转, 本文将对于生鲜类电商平台的订 ...
 - Java生鲜电商平台-API接口设计之token、timestamp、sign 具体架构与实现(APP/小程序,传输安全)
		
Java生鲜电商平台-API接口设计之token.timestamp.sign 具体设计与实现 说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃 ...
 
随机推荐
- Python之dict(或对象)与json之间转化
			
在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作. 在Python中自带json库.通过import json导入. 在json模块有2个方法, loads():将 ...
 - SAP MM MB5L事务代码'仅总计'选项初探
			
SAP MM MB5L事务代码'仅总计'选项初探 MB5L,如下查询条件, 报表结果里显示有差异, 而如下查询条件, 原因在于当勾选了'仅总计'选项以后,系统不考虑MM以外的影响库存金额的事务,而只是 ...
 - 如何编写 maptalks plugin
			
前面写过 maptalks plugin ( ArcGISTileLayer ),有读者留言说文章写得太精简,根据文章给出的核心代码没办法写出一个完整的 plugin ( 文中有完整 demo 地址, ...
 - window下操作jenkins查看页面的几种方式
			
原文:https://blog.csdn.net/kennin19840715/article/details/78782505 前几天通过jenkins本机执行selenium cases, 发现浏 ...
 - 删除带外键的表【foreign key constraint fails】报错
			
title: 删除带外键的表[foreign key constraint fails]报错 date: 2018-08-02 21:59:06 tags: 数据库 --- 遥想当时正在学hibern ...
 - 海思Hi3519A MPP从入门到精通(一 系统概述)
			
1. 概述 海思提供的媒体处理软件平台(Media Process Platform,简称 MPP),可支持应用软件快速 开发.该平台对应用软件屏蔽了芯片相关的复杂的底层处理,并对应用软件直接提供 M ...
 - 在linux中怎么查看错误日志
			
cat或者tail -f命令 日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一/var/log/secure 与安全 ...
 - Vim基础配置
			
vim 个性化设置 安装插件管理器Vundle: 创建目录: mkdir -p ~/.vim/bundle 下载文件: git clone https://github.com/VundleVim/V ...
 - RDPGuard6.1.7之后的问题
			
RDPGuard是一款保护远程桌面RDP端口不被暴力猜解的软件,说下在使用RDP Guard中遇到的一些问题: 1.似乎D版RDPGuard 6.1.7或之后的版本,启用IP Cloud会自动将大量I ...
 - 【转】理解并设计rest/restful风格接口
			
网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致AP ...