枚举+集合数据筛选

本文介绍了如何从数据库中提取小程序的访问数据,通过日期划分和枚举类型转换,将每日访问人数、新增和累计访问转化为7日、15日和30日的概览数据。利用枚举类和数据实体,实现数据结构重组并展示关键指标变化趋势。
摘要由CSDN通过智能技术生成

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传

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值