直接上代码,有空整理,时间仓促望理解。
@PostMapping("/partner/business/data/list")
public ResponseDTO<PageDTO<PartnerBusinessDataBO>> getPartnerBusinessDataList(
@RequestBody PageRequestDTO<PartnerBusinessDataQuery> request) throws Exception {
PartnerBusinessDataQuery param = request.getParam();
if(param == null) {
return RestResponseUtil.response(HttpStatus.BAD_REQUEST,
this.messageService.getMessage("request.parameter.invalid"), new PageDTO<>());
}
Long id = param.getPartnerId();
if(id == null || id < 0){
return RestResponseUtil.response(HttpStatus.BAD_REQUEST,
this.messageService.getMessage("request.parameter.invalid"), new PageDTO<>());
}
Date firstDate = null;
Date secondDate = null;
SimpleDateFormat format = new SimpleDateFormat(DateUtils.FORMAT_1);
if(param.getStartDate() == null || param.getEndDate() == null) {
firstDate = format.parse(PartnerBusinessDataEnum.START_DATE.getValue());
secondDate = format.parse(format.format(new Date()));
}else {
firstDate = DateUtils.toDate(param.getStartDate());
secondDate = DateUtils.toDate(param.getEndDate());
}
PartnerBusinessDataUtil partnerBusinessDataUtil = new PartnerBusinessDataUtil();
int total = partnerBusinessDataUtil.longOfTwoDate(firstDate,secondDate) + 1;
secondDate = partnerBusinessDataUtil.getSecondDate(secondDate, request.getPageNum(), request.getPageSize());
firstDate = partnerBusinessDataUtil.getFirstDate(firstDate, secondDate,request.getPageSize());
param.setStartDate(firstDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
param.setEndDate(secondDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
param.setPageSize(request.getPageSize());
List<PartnerBusinessDataBO> list = this.partnerScheduleTrackService.getPartnerBusinessDataList(param);
return RestResponseUtil.ok(this.messageService.getMessage("request.success"),
new PageDTO<>(new PageCountMethod().getCountNewPageInfo(total,list,request)));
}
List<PartnerBusinessDataBO> getPartnerBusinessDataList(PartnerBusinessDataQuery partnerBusinessDataQuery);
@Override
public List<PartnerBusinessDataBO> getPartnerBusinessDataList(PartnerBusinessDataQuery partnerBusinessDataQuery) {
List<PartnerBusinessDataBO> partnerBusinessDataBOS = new ArrayList<>(partnerBusinessDataQuery.getPageSize());
LocalDate startDate = partnerBusinessDataQuery.getStartDate();
LocalDate endDate = partnerBusinessDataQuery.getEndDate();
Calendar calendar = Calendar.getInstance();
calendar.setTime(DateUtils.toDate(endDate));
while (calendar.getTime().compareTo(DateUtils.toDate(startDate)) != -1){
PartnerBusinessDataBO partnerBusinessDataBO = new PartnerBusinessDataBO();
Date time = calendar.getTime();
LocalDate localDate = time.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
partnerBusinessDataQuery.setRegTime(localDate);
Integer registeredUserCount = this.partnerScheduleTrackMapper.findRegUserCount(partnerBusinessDataQuery);
if(registeredUserCount == null){
registeredUserCount = 0;
}
partnerBusinessDataBO.setCurrentDate(localDate);
partnerBusinessDataBO.setPartnerNo("NO45545");
partnerBusinessDataBO.setPartnerName("zhangsan");
partnerBusinessDataBO.setRegisteredUserCount(registeredUserCount);
partnerBusinessDataBO.setApplyUserCount(1);
partnerBusinessDataBO.setLoanUserCount(2);
partnerBusinessDataBO.setExpireUserCount(3);
partnerBusinessDataBO.setPaymentUserCount(4);
partnerBusinessDataBOS.add(partnerBusinessDataBO);
calendar.add(Calendar.DATE, -1);
}
return partnerBusinessDataBOS;
}
package com.rocky.fintech.boss.entity.schedule;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.rocky.fintech.boss.util.DateUtils;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDate;
@Getter
@Setter
public class PartnerBusinessDataQuery implements Serializable {
/**
* 用户ID
*/
private Long userId;
/**
*
*/
private Long partnerId;
/**
* 用户注册时间
*/
@JsonFormat(pattern = DateUtils.FORMAT_1)
private LocalDate regTime;
/**
* 每页几条
*/
private int pageSize;
/**
* 自然日 开始
*/
@JsonFormat(pattern = DateUtils.FORMAT_1)
private LocalDate startDate;
/**
* 自然日 结束
*/
@JsonFormat(pattern = DateUtils.FORMAT_1)
private LocalDate endDate;
/**
* 商户名称
*/
private String partnerName;
/**
* 用户类别 最小
*/
private Integer repeatsLoanCountMin;
/**
* 用户类别 最大
*/
private Integer repeatsLoanCountMax;
}
package com.rocky.fintech.boss.entity.schedule;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.rocky.fintech.boss.util.DateUtils;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDate;
@Getter
@Setter
public class PartnerBusinessDataBO implements Serializable {
/**
* 商户ID
*/
private Long partnerId;
/**
* 用户ID
*/
private Long userId;
/**
* 自然日 当前日期
*/
@JsonFormat(pattern = DateUtils.FORMAT_1)
private LocalDate currentDate;
/**
* 商户编号
*/
private String partnerNo;
/**
* 商户名称
*/
private String partnerName;
/**
* 注册用户
*/
private Integer registeredUserCount;
/**
* 申请用户
*/
private Integer applyUserCount;
/**
*
*/
private Integer loanUserCount;
/**
*
*/
private Integer expireUserCount;
/**
*
*/
private Integer paymentUserCount;
}
package com.rocky.fintech.boss.entity.schedule;
import com.github.pagehelper.PageInfo;
import com.rocky.fintech.entity.PageRequestDTO;
import java.util.List;
/**
* Created with IntelliJ IDEA.
*
* @Auther: zhangyi
* @Date: 2019/10/31/11:09
* @Description:
*/
public class PageCountMethod {
public PageInfo getCountNewPageInfo(int total, List list, PageRequestDTO request) {
PageInfo realPageInfo = new PageInfo<>(list);
int start = 0;
int end = 0;
int totalPages = 0;
int totalRecord = list.size();
int pageSize = request.getPageSize();
int size = request.getPageSize();
int number = request.getPageNum();
//设置总数
realPageInfo.setTotal(total);
//设置每页的显示条数
realPageInfo.setPageSize(size);
//设置要显示的是第几页的数据
realPageInfo.setPageNum(number);
//当前数
realPageInfo.setSize(totalRecord);
//计算获取对应的要显示的数据
if (totalRecord % pageSize == 0) {
totalPages = totalRecord / pageSize;
} else {
totalPages = totalRecord / pageSize + 1;
}
realPageInfo.setPages(totalPages);
//初始边界值计算
if (number == 1) {
start = 0;
realPageInfo.setHasPreviousPage(false);
realPageInfo.setPrePage(0);
realPageInfo.setIsFirstPage(true);
} else {
start = realPageInfo.getPageSize() * (realPageInfo.getPageNum() - 1);
realPageInfo.setHasPreviousPage(true);
realPageInfo.setPrePage(number - 1);
realPageInfo.setIsFirstPage(false);
}
realPageInfo.setStartRow((number - 1) * pageSize);
//结束边界值计算
if ((start + realPageInfo.getPageSize() > realPageInfo.getTotal())) {
end = totalRecord;
realPageInfo.setHasNextPage(false);
realPageInfo.setIsLastPage(true);
realPageInfo.setEndRow(totalRecord);
} else {
end = start + realPageInfo.getPageSize();
realPageInfo.setHasNextPage(true);
realPageInfo.setNextPage(number + 1);
realPageInfo.setIsLastPage(false);
realPageInfo.setEndRow((number) * pageSize);
}
if (start < end && end <= totalRecord) {
realPageInfo.setList(list.subList(start, end));
}
if (realPageInfo.getSize() == 0) {
realPageInfo.setStartRow(0);
realPageInfo.setEndRow(0);
} else {
realPageInfo.setStartRow(realPageInfo.getStartRow() + 1);
realPageInfo.setEndRow(realPageInfo.getStartRow() - 1 + realPageInfo.getSize());
}
realPageInfo.setPages(totalPages);
realPageInfo.setNavigateLastPage(totalPages > number ? number + 1 : totalPages);
return realPageInfo;
}
}
package com.rocky.fintech.boss.enums;
import lombok.Getter;
/**
* Created with IntelliJ IDEA.
*
* @Auther: zhangyi
* @Date: 2019/10/31/11:31
* @Description:
*/
@Getter
public enum PartnerBusinessDataEnum {
START_DATE("2019-10-01", "firstDate");
private final String value;
private final String name;
PartnerBusinessDataEnum(String value, String name) {
this.value = value;
this.name = name;
}
}
package com.rocky.fintech.util;
import java.util.Calendar;
import java.util.Date;
/**
* Created with IntelliJ IDEA.
*
* @Auther: zhangyi
* @Date: 2019/10/30/16:43
* @Description:
*/
public class PartnerBusinessDataUtil {
public int longOfTwoDate(Date first, Date second) throws Exception {
Calendar calendar = Calendar.getInstance();
calendar.setTime(first);
int cnt = 0;
while (calendar.getTime().compareTo(second) != 0) {
calendar.add(Calendar.DATE, 1);
cnt++;
}
return cnt;
}
public Date getSecondDate(Date second, Integer pageNum, Integer pageSize) throws Exception {
Calendar calendar = Calendar.getInstance();
calendar.setTime(second);
if(pageNum== null || pageNum == 0) {
pageNum = 1;
return calendar.getTime();
}
calendar.add(Calendar.DATE, -(pageNum-1)*pageSize);
return calendar.getTime();
}
public Date getFirstDate(Date first, Date second, Integer pageSize) throws Exception {
Calendar calendar = Calendar.getInstance();
calendar.setTime(second);
calendar.add(Calendar.DATE, -(pageSize-1));
if(calendar.getTime().compareTo(first) < 0) {
calendar.setTime(first);
return calendar.getTime();
}else {
return calendar.getTime();
}
}
}
另外贴出之前用过的部分代码,可以作为参考,如下:
@RequestMapping("/list")
public String getOverdueRecursiveList(String beginTime, String endTime, Integer page,
Integer size, Model model,String channelId,String device) throws Exception {
model.addAttribute("beginTime", beginTime);
model.addAttribute("endTime", endTime);
List<String> dates =null;
if (StringUtils.isBlank(beginTime) || StringUtils.isBlank(endTime)) {
LocalDate date = LocalDate.now().plusDays(-1);
beginTime = date.plusDays(-29).toString();
endTime = date.toString();
dates = DateTimeUtil.getBetweenDate(beginTime, endTime);
}
if((beginTime!=null && beginTime!="") && (endTime!=null && endTime!="")) {
dates = DateTimeUtil.getBetweenDate(beginTime, endTime);
}
if(dates.size()==0) {
if((beginTime!=null && beginTime!="") && (endTime!=null && endTime!="")) {
dates.add(beginTime);
}
}
if(size==null || size<15) {
size=15;
}
if(page==null || page<1) {
page=1;
}
Collections.reverse(dates); // 倒序排列
List<String> thisDates = new ListPaging().page(dates,size,page);
List<Map<String, Object>> totalDataList = new ArrayList<Map<String,Object>>();
for (int i = 0; i < thisDates.size(); i++) {
String beginTimen = thisDates.get(i) + Constant.beginTimeOfDay;
String endTimen = thisDates.get(i) + Constant.endTimeOfDay;
//
List<OrderLoan> olList = orderLoanService.queryOverdueRecursiveByDate("3","0",channelId,device,beginTimen, endTimen);
//
int shouldCount = olList.size();
//
BigDecimal newBig = new BigDecimal(0);
BigDecimal oneOdds = newBig;
BigDecimal twoOdds = newBig;
BigDecimal threeOdds = newBig;
BigDecimal fourOdds = newBig;
BigDecimal fiveOdds = newBig;
BigDecimal sixOdds = newBig;
BigDecimal sevenOdds = newBig;
BigDecimal eightOdds = newBig;
BigDecimal nineOdds = newBig;
BigDecimal tenOdds = newBig;
BigDecimal elevenOdds = newBig;
BigDecimal twelveOdds = newBig;
BigDecimal thirteenOdds = newBig;
BigDecimal fourteenOdds = newBig;
BigDecimal fifteenOdds = newBig;
if(shouldCount>0) {
//
int oneDayCount = 0;
int twoDaysCount = 0;
int threeDaysCount = 0;
int fourDaysCount = 0;
int fiveDaysCount = 0;
int sixDaysCount = 0;
int sevenDaysCount = 0;
int eightDaysCount = 0;
int nineDaysCount = 0;
int tenDaysCount = 0;
int elevenDaysCount = 0;
int twelveDaysCount = 0;
int thirteenDaysCount = 0;
int fourteenDaysCount = 0;
int fifteenDaysCount = 0;
for (int j = 0; j < olList.size(); j++) {
int overdue = olList.get(j).getOverdue();
switch (overdue) {
//
case 1:
oneDayCount++;
break;
case 2:
twoDaysCount++;
break;
case 3:
threeDaysCount++;
break;
case 4:
fourDaysCount++;
break;
case 5:
fiveDaysCount++;
break;
case 6:
sixDaysCount++;
break;
case 7:
sevenDaysCount++;
break;
case 8:
eightDaysCount++;
break;
case 9:
nineDaysCount++;
break;
case 10:
tenDaysCount++;
break;
case 11:
elevenDaysCount++;
break;
case 12:
twelveDaysCount++;
break;
case 13:
thirteenDaysCount++;
break;
case 14:
fourteenDaysCount++;
break;
case 15:
fifteenDaysCount++;
break;
default:
break;
}
}
//
oneOdds = new BigDecimal(oneDayCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
//
twoOdds = new BigDecimal(twoDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
threeOdds = new BigDecimal(threeDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
fourOdds = new BigDecimal(fourDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
fiveOdds = new BigDecimal(fiveDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
sixOdds = new BigDecimal(sixDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
sevenOdds = new BigDecimal(sevenDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
eightOdds = new BigDecimal(eightDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
nineOdds = new BigDecimal(nineDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
tenOdds = new BigDecimal(tenDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
elevenOdds = new BigDecimal(elevenDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
twelveOdds = new BigDecimal(twelveDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
thirteenOdds = new BigDecimal(thirteenDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
fourteenOdds = new BigDecimal(fourteenDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
fifteenOdds = new BigDecimal(fifteenDaysCount).divide(new BigDecimal(shouldCount),4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(100));
}
Map<String, Object> totalDataMap = new HashMap<String, Object>();
OrderAmountUtil oal = new OrderAmountUtil();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
int days = oal.daysBetween(sdf.parse(thisDates.get(i)), sdf.parse(sdf.format(new Date())));
if(days<0) {
days = 0;
}
OrderApplyDTO loanCountDTO = new OrderApplyDTO();
loanCountDTO.setBeginTime(beginTimen);
loanCountDTO.setEndTime(endTimen);
loanCountDTO.setChannelId(channelId);
loanCountDTO.setDevice(device);
loanCountDTO.setIsTime("dueTime");
loanCountDTO.setLoanStatus("shouldRepay");
OrderApplyDTO overdueCountDTO = new OrderApplyDTO();
overdueCountDTO.setBeginTime(beginTimen);
overdueCountDTO.setEndTime(endTimen);
overdueCountDTO.setChannelId(channelId);
overdueCountDTO.setDevice(device);
overdueCountDTO.setIsTime("dueTime");
overdueCountDTO.setApplyStatus("3");
totalDataMap.put("lendDate", thisDates.get(i));//日期
totalDataMap.put("loanCount", this.orderLoanService.queryLoanAllParameter(loanCountDTO));
totalDataMap.put("overdueCount", this.orderLoanService.queryLoanAllParameter(overdueCountDTO));
totalDataMap.put("oneOdds", oneOdds);
totalDataMap.put("twoOdds", twoOdds);
totalDataMap.put("threeOdds", threeOdds);
totalDataMap.put("fourOdds", fourOdds);
totalDataMap.put("fiveOdds", fiveOdds);
totalDataMap.put("sixOdds", sixOdds);
totalDataMap.put("sevenOdds", sevenOdds);
totalDataMap.put("eightOdds", eightOdds);
totalDataMap.put("nineOdds", nineOdds);
totalDataMap.put("tenOdds", tenOdds);
totalDataMap.put("elevenOdds", elevenOdds);
totalDataMap.put("twelveOdds", twelveOdds);
totalDataMap.put("thirteenOdds", thirteenOdds);
totalDataMap.put("fourteenOdds", fourteenOdds);
totalDataMap.put("fifteenOdds", fifteenOdds);
totalDataMap.put("days", days);
totalDataList.add(totalDataMap);
}
model.addAttribute("totalDataList", totalDataList);
model.addAttribute("size", this.getPageSize(size));
model.addAttribute("page", this.getPage(page));
model.addAttribute("pages", this.getTotalPage(dates.size(), size));
model.addAttribute("channels", this.operationService.getChannelList(1));
model.addAttribute("device", device);
model.addAttribute("channelId", channelId);
return "statistics/overdueRecursive/list";
}
package com.canary.finance.util;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
public class DateTimeUtil {
/**
* 获取两个日期间隔的所有日期
* @param start 格式必须为'2018-01-25'
* @param end 格式必须为'2018-01-25'
* @return
*/
public static List<String> getBetweenDate(String start, String end){
List<String> list = new ArrayList<>();
LocalDate startDate = LocalDate.parse(start);
LocalDate endDate = LocalDate.parse(end);
long distance = ChronoUnit.DAYS.between(startDate, endDate);
if (distance < 1) {
return list;
}
Stream.iterate(startDate, d -> {
return d.plusDays(1);
}).limit(distance + 1).forEach(f -> {
list.add(f.toString());
});
return list;
}
/**
* 返回一天中每个小时段的开始时间和结束时间 如: (凌晨2点数据)格式:
* 开始2019-03-21 01:00:00 2019-03-21 01:59:59
* @param dateTime
* @return
*/
public static List<Map<String, Object>> getBetweenDateTime(LocalDate dateTime) {
List<Map<String, Object>> totalDataList = new ArrayList<>();
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String dateTimeStr = format.format(dateTime);
int timeCount = 24;
for (int i = 0; i < timeCount; i++) {
Map<String, Object> totalDataMap = new HashMap<String, Object>();
if(i<10) {
totalDataMap.put("beginTime", dateTimeStr+" 0"+i+":00:00");
totalDataMap.put("endTime", dateTimeStr+" 0"+i+":59:59");
totalDataList.add(totalDataMap);
}else {
totalDataMap.put("beginTime", dateTimeStr+" "+i+":00:00");
totalDataMap.put("endTime", dateTimeStr+" "+i+":59:59");
totalDataList.add(totalDataMap);
}
}
return totalDataList;
}
/**
*(仅做展示使用) 获取一天24个时间 格式:1:00-24:00
* @return
*/
public static String[] getTime() {
String[] arrayTime = new String[24];
for (int i = 0; i <arrayTime.length; i++) {
arrayTime[i]=(i+1)+":00";
}
return arrayTime;
}
public static void main(String[] args) {
List<String> list = DateTimeUtil.getBetweenDate("2019-01-14", "2019-03-15");
for(String str:list) {
System.out.println(str);
}
}
}
protected int longOfTwoDate(Date first, Date second) throws Exception {
Calendar calendar = Calendar.getInstance();
calendar.setTime(first);
int cnt = 0;
while (calendar.getTime().compareTo(second) != 0) {
calendar.add(Calendar.DATE, 1);
cnt++;
}
return cnt;
}
protected Date getSecondDate(Date second, Integer page) throws Exception {
Calendar calendar = Calendar.getInstance();
calendar.setTime(second);
if(page== null || page == 0) {
page = 1;
return calendar.getTime();
}
calendar.add(Calendar.DATE, -(page-1)*15);
return calendar.getTime();
}
protected Date getFirstDate(Date first, Date second) throws Exception {
Calendar calendar = Calendar.getInstance();
calendar.setTime(second);
calendar.add(Calendar.DATE, -14);
if(calendar.getTime().compareTo(first) < 0) {
calendar.setTime(first);
return calendar.getTime();
}else {
return calendar.getTime();
}
}
protected int getOffset(Integer page, Integer size) {
if(page == null || page == 0 ) {
page = 1;
}
if(size == null || size == 0) {
size = 15;
}
return (page-1)*size;
}
protected int getPageSize(Integer size) {
if(size == null || size == 0) {
size = 15;
}
return size;
}
protected int getPage(Integer page) {
if(page == null || page == 0) {
page = 1;
}
return page;
}
protected int getTotalPage(int total, Integer size) {
if(size == null || size == 0) {
size = 15;
}
return (int)Math.ceil((double)total / (double)size);
}
仅做参考和对比,没有整理,用者谨慎。