使用laravel6框架,实现excel表一列N行,N个字段作为筛选器,N个字段作为统计值的功能
整体实现思路:
1.dataTableForm接口
根据需求,需要对哪些表进行自定义的数据统计,提供可以选择的数据表(也可以由前端来提供)
2.fieldsData接口
根据选择的数据表,获取需要统计的表字段
3.fieldDataForm接口
根据选择的字段(该字段可能是生成的数据表格中的 列字段,行字段,或者是用来 筛选数据的筛选器),获取该字段的值(如果数据量大,一般要增加时间作为条件,过滤数据)
4.generateData接口(核心逻辑实现)
5.saveData接口
将生成数据所需要用到的字段和字段值,保存到mysql数据表(column_data,line_data,total_data,filter_data字段,都要以json格式存储)
6.dataInfo接口
查看表格数据的详情,将必要的参数,一起传给 generateData 接口,生成相应的数据
7.dataDetail接口
表格数据详情,在编辑时,只返回字段值(行字段,列字段,筛选器字段,统计值字段),还有一些表格的其他信息
8.updateData接口
将生成数据所需要用到的字段和字段值,保存到mysql数据表(column_data,line_data,total_data,filter_data字段,都要以json格式存储)
generateData 生成数据接口,postman请求demo:
column_data:{"organizationName":["a有限公司","b有限公司","c有限公司"]}
line_data:{"organizationTypeName":["a","b","c"], "attribute": ["aa", "bb", "cc"]}
total_data:["departmentName", "goodPrice"]
filter_data:{"startDate":["2022-04-01"],"endDate":["2022-04-25"], "orderCode": ["aaa", "bbb"]}
table_type:1000
column_data:列字段,organizationName 字段,只要该字段指定的值
line_data:行字段,organizationTypeName 和 attribute 字段,只要这些字段指定的值;
organizationTypeName:第一层
attribute:第二层(分别嵌套在第一层的每个值下面)
如:
a
aa
bb
cc
b
aa
......
total_data:统计字段,departmentName 字段,字符串类型,统计值的个数;
goodPrice字段,数值类型,统计值的总和
要根据 mongodb 的 tableFields 表来判断字段的数据类型
filter_data:筛选器字段,startDate和endDate字段,orderCode 字段,作为筛选条件(where),过滤值
table_type:表格类型(定位到某张数据表)
生成数据的效果:
一、数据库表
1.mysql数据库表
(1)数据透视-组装图表表
CREATE TABLE app_sjzt_data_view_chart_assembly (
id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
title varchar(255) NOT NULL DEFAULT '' COMMENT '图表名称(表格名称)',
table_type char(4) NOT NULL DEFAULT '1000' COMMENT '表格类型 1000-线下订单宽表 1001-线下客户的发货宽表',
column_datalongtextCOMMENT '列数据',
line_datalongtextCOMMENT '行数据',
total_datalongtextCOMMENT '数值数据(需要统计的字段)',
filter_datalongtextCOMMENT '筛选器数据(需要过滤的字段)',
user_id int(11) NOT NULL DEFAULT '0' COMMENT '用户id',
state char(4) NOT NULL DEFAULT '1001' COMMENT '状态 1001-正常 1002-禁用 1003-删除',
created_at datetime DEFAULT NULL COMMENT '创建时间',
updated_at datetime DEFAULT NULL COMMENT '修改时间',
deleted_at datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='数据透视-组装图表表';
(2)数据透视-表字段管理表
CREATE TABLE app_sjzt_data_view_chart_assembly_fields (
id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
table_type char(4) NOT NULL DEFAULT '1000' COMMENT '表格类型 1000-线下订单宽表 1001-线下客户的发货宽表 1002-线下客户的机构宽表',
en_name varchar(255) NOT NULL DEFAULT '' COMMENT '字段英文名',
cn_name varchar(255) NOT NULL DEFAULT '' COMMENT '字段中文名',
sort int(11) NOT NULL DEFAULT 0 COMMENT '排序(值越大,越靠前)',
state char(4) NOT NULL DEFAULT '1001' COMMENT '状态 1001-正常 1002-禁用 1003-删除',
created_at datetime DEFAULT NULL COMMENT '创建时间',
updated_at datetime DEFAULT NULL COMMENT '修改时间',
deleted_at datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='数据透视-表字段管理表';
2.mongodb数据库表(存储json格式的数据)
(1)线下订单宽表 statisticsOrderExtend
(2)线下客户的发货宽表 statisticsDeliverExtend
(3)线下客户的机构宽表 statisticsOrganizationExtend
(4)数据表 每个/用到的 表字段 对应的数据类型(字符串,数值等)表 tableFields --- 用于判断字段,是要统计个数,还是要统计数值的总和
二、路由
三、控制器controller
SjztDataViewApiController.php
四、服务service(不包含生成数据的接口)
SjztDataViewApiService.php
五、模型model
(1)AppSjztDataViewChartAssembly.php --- 保存生成的数据
(2)AppSjztDataViewChartAssemblyFields.php --- 保存每个数据表用到的字段信息
(3)BaseModel.php --- 公共的model
(1)使用了软删除
(2)dateTime类型的字段值,自动填充值
(3)created_at,updated_at,deleted_at 字段自动填充时间