多个条件的分页查询
public PageResult<ActivityInfoResDTO> queryPage(ActivityQueryForPageReqDTO reqDTO) {
Page<Activity> pagequery = new Page<>(reqDTO.getPageNo(),reqDTO.getPageSize());
LambdaQueryWrapper<Activity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(reqDTO.getId()!=null,Activity::getId,reqDTO.getId())
.eq(reqDTO.getName()!=null&&reqDTO.getName()!="",Activity::getName,reqDTO.getName())
.eq(reqDTO.getType()!=null,Activity::getType,reqDTO.getType())
.eq(reqDTO.getStatus()!=null,Activity::getStatus,reqDTO.getStatus());
// pagequery.addOrder()
// 添加排序条件(如果提供了排序字段和排序方向)
if (reqDTO.getOrderBy1() != null && !reqDTO.getOrderBy1().isEmpty()) {
if (reqDTO.getIsAsc1()!= null && reqDTO.getIsAsc1()) {
// todo 这样的话就不转为下划线了
// wrapper.orderByAsc();
pagequery.addOrder(OrderItem.asc(reqDTO.getOrderBy1())); //这个asc里面填的直接是列名
} else {
pagequery.addOrder(OrderItem.desc(reqDTO.getOrderBy1()));
}
}
if (reqDTO.getOrderBy2() != null && !reqDTO.getOrderBy2().isEmpty()) {
if (reqDTO.getIsAsc2()!= null && reqDTO.getIsAsc2()) {
pagequery.addOrder(OrderItem.asc(reqDTO.getOrderBy2()));
} else {
pagequery.addOrder(OrderItem.desc(reqDTO.getOrderBy2()));
}
}
Page<Activity> page = this.page(pagequery, wrapper);
List<Activity> records = page.getRecords();
List<ActivityInfoResDTO> list = BeanUtils.copyToList(records, ActivityInfoResDTO.class);
PageResult<ActivityInfoResDTO> pageResult = new PageResult<>();
pageResult.setPages(page.getPages());
pageResult.setTotal(page.getTotal());
pageResult.setList(list);
return pageResult;
}
设置比较复杂的mp 语句 setsql apply
LambdaUpdateWrapper<ReservationSetting> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(ReservationSetting::getOrderDate,placeOrderReqDTO.getReservationDate())
.setSql("reservations = reservations+1")
.apply("number > reservations + 1");
取得当月第一天
date 是string类型的
YearMonth yearMonth = YearMonth.parse(date, DateTimeFormatter.ofPattern("yyyy-MM"));
LocalDate firstDay = yearMonth.atDay(1); // 获取当前月的第一天
LocalDate lastDay = yearMonth.atEndOfMonth();
读取excel文件进行批量操作
@RequestPart
- @RequestPart这个注解用在multipart/form-data表单提交请求的方法上。
- 支持的请求方法的方式MultipartFile,属于Spring的MultipartResolver类。这个请求是通过http协议传输的。
- @RequestParam也同样支持multipart/form-data请求。
- 他们最大的不同是,当请求方法的请求参数类型不再是String类型的时候。@RequestParam适用于name-value “String”类型的请求域,@RequestPart适用于复杂的请求域(像JSON,XML)例如:key = user, value = {“name”:“aaa”,“xx”:“xx”}。
- @RequestParam适用于name-valueString类型的请求域,@RequestPart适用于复杂的请求域(像JSON,XML)
@PostMapping("/upload")
@ApiOperation("上传文件批量预约设置")
public void upload(@RequestPart("file") MultipartFile file) {
reservationSettingService.editNumberByExcel(file);
}
public void editNumberByExcel(MultipartFile file) {
try {
EasyExcel.read(file.getInputStream(), ReservationImportData.class, new ReservationSettingListener(owner)).sheet().doRead();
} catch (IOException e) {
throw new BadRequestException("格式存在错误");
}
}
实现方式
使用阿里的easyexcel ,直接查看官方文档即可
读的时候 首先写一个监听器,每读到一行数据都会触发invoke方法。读的时候都是都是以string 读入的,然后自己进行转换
public class ReservationSettingListener implements ReadListener<ReservationImportData> {
/**
* 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 100;
/**
* 缓存的数据
*/
private List<ReservationSetting> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
/**
* 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
*/
private IReservationSettingService settingService;
/**
* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
*/
public ReservationSettingListener(IReservationSettingService settingService) {
this.settingService = settingService;
}
/**
* 这个每一条数据解析都会来调用
* 每解析一条数据都会调用
*/
@Override
public void invoke(ReservationImportData importData, AnalysisContext analysisContext) {
ReservationSetting reservationSetting = new ReservationSetting();
reservationSetting.setNumber(importData.getNumber());
reservationSetting.setOrderDate(LocalDate.parse(importData.getDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
cachedDataList.add(reservationSetting);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (cachedDataList.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
}
}
/**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
}
/**
* 加上存储数据库
*/
private void saveData() {
if (cachedDataList.size() > 0){
settingService.saveBatch(cachedDataList);
}
}
}
统计订单状态
最好定义一个实体类来接收,否则难转化,map的话 需要用list<map> 因为会死多行 两列,map的话 key就是列名,值才是数据 map.get(status) map.get(count) 这样比较麻烦 ,定义一个实体类接受比较好
last一般与limit配合