实战场景:
查询每个人员信息(record_user表)含多个打卡记录(record_colok表)。
/**
* 人员打卡信息分页模糊查询
* @param page
* @param pageSize
* @param list
* @param userName
* @param userCode
* @param userTown
* @param userVillage
* @return
*/
@Override
public Page<RecordUserDto> pageDto(int page, int pageSize, Integer list, String userName, String userCode, String userTown, String userVillage) {
//查询人员基本信息
Page<RecordUser> pageInfo1 = recordMgtService.pageUser(page, pageSize, list, userName, userCode, userTown, userVillage);
//构造分页构造器
//人员信息+打卡记录,分页构造器
Page<RecordUserDto> recordUserDtoPage = new Page<>();
BeanUtils.copyProperties(pageInfo1, recordUserDtoPage, "records");
List<RecordUser> records = pageInfo1.getRecords();
final String year = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy"));//转换为年格式
final StringJoiner initiateTime = new StringJoiner("-").add(year).add("01").add("01");//拼接"月-日"
final String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
//方式一:遍历集合,循环里操作数据库有风险
/*List<RecordUserDto> recordUserDtoList = records.stream().map((item) -> {
RecordUserDto recordUserDto = new RecordUserDto();
BeanUtils.copyProperties(item, recordUserDto);
String userCode1 = item.getUserCode();
LambdaQueryWrapper<RecordClock> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(RecordClock::getUserCode, userCode1)
.ge(RecordClock::getClockTime, initiateTime.toString())
.le(RecordClock::getClockTime, currentTime)
.select(RecordClock::getClockTime);
List<RecordClock> recordClocks = list(queryWrapper);
recordUserDto.setRecordClocks(recordClocks);
return recordUserDto;
}).collect(Collectors.toList());
recordUserDtoPage.setRecords(recordUserDtoList);
return recordUserDtoPage;
}*/
//获取身份证号集合
List<String> userCodeList = records.stream().map((item) -> {
RecordUserDto recordUserDto = new RecordUserDto();
BeanUtils.copyProperties(item, recordUserDto);
String userCode1 = item.getUserCode();
return userCode1;
}).collect(Collectors.toList());
//更据身份证号集合查询打卡信息集合
LambdaQueryWrapper<RecordClock> queryWrapper = new LambdaQueryWrapper();
queryWrapper.in(RecordClock::getUserCode,userCodeList)
.ge(RecordClock::getClockTime, initiateTime.toString())
.le(RecordClock::getClockTime, currentTime)
.orderByAsc(RecordClock::getClockTime)
.select(RecordClock::getClockTime,RecordClock::getUserCode);
List<RecordClock> recordClockList = list(queryWrapper);
//分组
Map<String,List<RecordClock>> collect = recordClockList.stream().collect(Collectors.groupingBy(RecordClock::getUserCode));
//将数据整合到Dto类
List<RecordUserDto> recordUserDtoList = records.stream().map((item) -> {
RecordUserDto recordUserDto = new RecordUserDto();
BeanUtils.copyProperties(item, recordUserDto);
List<RecordClock> recordClockList1 = collect.get(item.getUserCode());
recordUserDto.setRecordClocks(recordClockList1);
return recordUserDto;
}).collect(Collectors.toList());
recordUserDtoPage.setRecords(recordUserDtoList);
return recordUserDtoPage;
}
涉及两个知识点:
java8的LocalDate类,日期拼接。
//获取当前日期,转换为年格式
final String year = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy"));
//自定义拼接"月-日"
final StringJoiner initiateTime = new StringJoiner("-").add(year).add("01").add("01");
//时间转化为Sting类型
InitiateTime.toString();
//获取当前日期,转换为"年-月-日"格式
final String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
List集合分组
将List集合根据相同Key(userCode)进行分组,转化为Value为List<RecordClock.>的Map集合
//分组
Map<String,List<RecordClock>> collect = recordClockList.stream().collect(Collectors.groupingBy(RecordClock::getUserCode));