1.情景展示

如上圖所示,按日期進行數據統計,我們知道,數據的來源肯定是數據庫,一旦指定時間段,必然存在日期空缺的情況(也就是當天沒有產生數據)
除了使用SQL填補空缺日期記錄外,有時我們不得不在java中做處理,填補空缺日期,並造當天的數據(最好還是使用SQL,實在實現不了再用java)
這種情況也很常見,今天我們一起來看下,如何通過java填補空缺的數據,並返回給前端?
2.解決方案
/**
* 開票統計(按天統計)
*/
@GetMapping("czKptJ/days")// /ticket/index/czKptJ/days
@ApiOperation("首頁開票統計(走勢圖)")
public Result<List<CzKpTjDays>> getczKptJByDays(){
// 當前用戶
UserDetailBO currentUser = userHandler.getCurrentUser();
// 查詢條件
List<CzKpTjDays> result = czKpTjDaysManager.lambdaQuery()
.eq(CzKpTjDays::getOrgCode, currentUser.getOrgcode())
.ge(CzKpTjDays::getKpDate,DateUtils.getForwardTowardDate(-6))
.le(CzKpTjDays::getKpDate,DateUtils.getToday())
.list();
// 不夠7天,說明日期存在空缺
if (result.size() < 7) {
// Step 1:從查詢結果中提取日期
List<LocalDate> resultDateList = new ArrayList<>(result.size());
result.forEach(row ->{
resultDateList.add(row.getKpDate());
});
// Step 2:獲取當前時間的前7天時間,共7天
LocalDate[] datesArray = {DateUtils.getForwardTowardDate(-6), DateUtils.getForwardTowardDate(-5), DateUtils.getForwardTowardDate(-4), DateUtils.getForwardTowardDate(-3), DateUtils.getForwardTowardDate(-2), DateUtils.getForwardTowardDate(-1), DateUtils.getToday()};
// Step 3:array-->list
List<LocalDate> addDateList = new ArrayList<>(Arrays.asList(datesArray));
// Step 4:將查詢結果中的日期排除在外
addDateList.removeAll(resultDateList);
// Step 5:准備將要填充的數據
List<CzKpTjDays> addList = new ArrayList<>(addDateList.size());
addDateList.forEach(date -> {
addList.add(new CzKpTjDays().setKpDate(date).setFsKpTotal(new BigDecimal(0)).setMzKpTotal(new BigDecimal(0)).setZyKpTotal(new BigDecimal(0)).setOrgCode(currentUser.getOrgcode()));
});
// Step 6:添加到原有list中
result.addAll(addList);
// Step 7:冒泡排序
for (int i = 0; i < result.size() - 1; i++) {
for (int j = 1; j < result.size() - i; j++) {
CzKpTjDays czKpTjDays;
// 前面的日期大於后面的日期
if ((result.get(j - 1).getKpDate()).isAfter(result.get(j).getKpDate())) {
czKpTjDays = result.get(j - 1);
// 交換值
result.set((j - 1), result.get(j));
result.set(j, czKpTjDays);
}
}
}
}
return Results.succ(result);
}
不用在意語法問題,關鍵看思路,難點在於從返回的數據中如何確定缺失的日期。
20200910
關於最后的日期排序,其實可以不用這么復雜,直接利用java8的特性,即可實現升序排列
// 數據按日期升序排列
result.sort(new Comparator<CzKpTjDays>(){
@Override
public int compare(CzKpTjDays o1, CzKpTjDays o2) {
return o1.getKpDate().compareTo(o2.getKpDate());
}
});
List簡單版
public static void main(String[] args) {
Integer[] numArray = {7,6,5,4,3,2,1};
// Array-->List(泛型必須是封裝類)
List<Integer> numList = new ArrayList<>(Arrays.asList(numArray));
// 我的list
ArrayList<Integer> myList = new ArrayList<>();
myList.add(1);
myList.add(5);
// 將numList所有元素添加到myList中
myList.addAll(numList);
System.out.println("myList集合:" + myList);
// 利用set的唯一性特性進行去重
HashSet<Integer> mySet = new HashSet<>();
mySet.addAll(myList);
System.out.println("mySet去重:" + mySet);
// Set-->ArrayList
ArrayList<Integer> newList = new ArrayList<>();
newList.addAll(mySet);
System.out.println("去重后的list:" + newList);
// 升序排列(要想調用排序方法,必須使用ArrayList)
newList.sort(Integer::compareTo);
System.out.println("升序排列:" + newList);
}

