需求
统计某一产品的近n天的每天的销量和包裹数量,用于前端实现数据可视化
初始代码
原始数据通过造假数据获取
基础类
// 保存查询结果集
@Data
public class DataGroupBO {
/**
* pms sku
*/
private String pmsSku;
/**
* om_order_id
*/
private String omsOrderId;
/**
* sku销售数量
*/
private Integer productQuantity;
/**
* 付款时间
*/
private Date payTime;
/**
* 包裹单号
*/
private String packageCode;
/**
* 仓库code
*/
private String warehouseCode;
}
//中转bo,用来临时存放将要处理的数据
@Data
public class SkuSalesCountBO {
/**
* om_order_id
*/
private String omsOrderId;
/**
* sku销售数量
*/
private Integer productQuantity;
/**
* 包裹单号
*/
private String packageCode;
/**
* 付款时间
*/
private Date payTime;
/**
* 付款日期
*/
private String date;
}
//内层vo
@Data
public class OmsSalesCountVO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "销量")
private Integer salesCount;
@ApiModelProperty(value = "包裹数量")
private Integer packageCount;
@ApiModelProperty(value = "付款时间,精确到日期")
private String date;
@ApiModelProperty(value = "付款时间,精确到秒")
private Date dateTime;
}
//外层vo
@Data
public class OmsSalesTrendVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* sku
*/
@ApiModelProperty(value = "sku")
private String sku;
/**
* 仓库编码
*/
@ApiModelProperty(value = "仓库编码")
private String warehouseCode;
/**
* 销量和包裹数量信息
*/
@ApiModelProperty(value = "销量和包裹数量信息")
private List<OmsSalesCountVO> countList;
}
造假数据
- 其中,一个产品对应多个订单,一个订单可以有多个包裹
- 销量字段productQuantity是以订单号为维度的确定的,与包裹号无关
- 原始数据中,包裹号是可以唯一定位的
- 模拟90天,大约产生9k-90w条数据(包裹量)
private void addData(List<DataGroupBO> list) {
// 90天循环
for (int i = 0 ; i < 90 ; i++ ) {
DateTime dateTime = DateUtil.offsetDay(new Date(), i - 90);
//每天随机单量100-1000
int orderCount = (int) (Math.random() * 999) + 100;
for (int j = 0; j < orderCount; j++) {
//每单随机包数量1-10
int packageCount = (int) (Math.random() * 9) + 1;
//每单随机销量1-10
int count = (int) (Math.random