1.数据库表
id | gmt_create | gmt_modified | stat_date | index_code | app_id | result |
id 自增长 | 创建时间date | 更新时间 Date | 统计时间 date | 指标对应枚举 Int | 小程序id | 统计结果(数字) |
该表在数据库中主要是存一个小程序的访问人数、新增访问人数、累计访问人数。这些表现在于index_code
例如
Id | Gmt_create | Gmt_modified | Stat_date | Index_code | App_id | result |
1 | 2021/8/7 | 2021/8/7 | 2021/8/7 | 3 | 123456 | 45 |
2 | 2021/8/7 | 2021/8/7 | 2021/8/7 | 4 | 123456 | 33 |
3 | 2021/8/7 | 2021/8/7 | 2021/8/7 | 5 | 123456 | 55 |
3是代表访问人数、4代表新增访问人数、5代表累计访问人数。
在appid这个字段中若appid为空的时候,则这条数据代表的是所有app今日的访问数量
Id | Gmt_create | Gmt_modified | Stat_date | Index_code | App_id | result |
4 | 2021/8/7 | 2021/8/7 | 2021/8/7 | 3 | 77 | |
5 | 2021/8/7 | 2021/8/7 | 2021/8/7 | 4 | 55 | |
6 | 2021/8/7 | 2021/8/7 | 2021/8/7 | 5 | 66 |
2.枚举类
public enum A implements IEum { CARD_1(1, "访问人数", a, b), CARD_2(2, "新增访问人数", c, d), CARD_3(3, "累计访问人数", e, f), ; private Integer code; private String desc; private B OneApp; private B AllApp; public B getIndexType(boolean all) { if (all) { return OneApp; } return AllApp; } }
public enum B{
a(1, "单个小程序访问人数"), b(4, "全部个小程序访问人数"), c(2, "单个小程新增访问人数"), d(5, "全部小程新增访问人数"), e(3, "单个小程序累计访问人数"), f(6,"全部小程序累计访问人数")
private int code;
private String mesg;
}
3.数据库对应实体类
@data
public class C { private Long id; private LocalDateTime gmtCreate; private LocalDateTime gmtModified; private LocalDate statDate; private Integer indexCode; private String appId; private Long result; }
4.集合获取数据(使用Dao层的接口获取数据库的数据)
List<C> db = resultMapper.findList(appid, nowdate+30, nowdate); db中就获取了小程序的T到T-30日内的所有访问数据,其中有每天的访问人数、新增访问人数、累计访问人数这样组成一天的数据,这样的数据有30组。现在我们需要截取db中的7日、15日、30日的数据信息。
为了保存这样一个新的数据结构,我们需要再创建一个新的实体类进行保存
public class D { private String title; private Double count; private Double day; private Double week; private Double month; private boolean ratio; }
5.正式使用集合+枚举区分这三组数据。
List<C> db = resultMapper.findList(appid, nowdate+30, nowdate);
List<D> result = new ArrayList<>(); //用于存储区分好的数据
List<A> top = Arrays.asList(CARD_1, CARD_2, CARD_3);//把三个枚举对象放入list中
top.forEach(dashboardType -> { Map<String, Double> map = db.stream() .filter(item -> dashboardType.getIndexType(req.isAll()).isThisType(item.getIndexCode())) .collect(Collectors.toMap(item -> DateUtil.format(item.getStatDate()), item -> item.getResult().doubleValue())); result.add(new OverviewRsp() .setRatio(false) .setTitle(dashboardType.getDesc()) .setCount(map.getOrDefault(dayStr, 0.0)) .setDay(map.getOrDefault(dayBeforeDayStr, 0.0)) .setWeek(map.getOrDefault(weekBeforeDayStr, 0.0)) .setMonth(map.getOrDefault(monthBeforeDayStr, 0.0))); });
解释:
db.stream()
.filter(item -> dashboardType.getIndexType(req.isAll()).isThisType(item.getIndexCode()))
.collect(Collectors.toMap(item -> DateUtil.format(item.getStatDate()), item -> item.getResult().doubleValue()));
db.stream().fliter("这个地方填写过滤条件").collect(把符合条件的数据赋值到新的map中)
过滤条件:
item -> dashboardType.getIndexType(req.isAll()).isThisType(item.getIndexCode())
这里根据数据库查出来的index_code字段来分辨上面类型的数据
后面 result.add(new OverviewRsp() .setRatio(false) .setTitle(dashboardType.getDesc()) .setCount(map.getOrDefault(dayStr, 0.0)) .setDay(map.getOrDefault(dayBeforeDayStr, 0.0)) .setWeek(map.getOrDefault(weekBeforeDayStr, 0.0)) .setMonth(map.getOrDefault(monthBeforeDayStr, 0.0)));
是把这一轮循环的数据放入result中,在result这个list中存放的对应数据就应该是访问人数、新增访问人数、累计访问人数。
再把这个reslut传