查询数据返回时自动进行汇总统计,适用于LayUI表格需要统计的查询
· java spring boot 查询报表数据时自动进行数据统计Code,主要适用LayUI表格需要统计汇总时,其它情况也可适应,主要看需求,按需调整。
数据返回类
import com.central.common.utils.CommonUtils;
import lombok.Data;
import java.util.List;
/**
* layUI 统计表格专用数据返回结果集,自动计算合计
* @Auther WangXinXi
* @Date 2021/1/21
*/
@Data
public class ResultReport<T> {
/**
* 总数
*/
private Long count;
/**
* 是否成功:0 成功、1 失败
*/
private int code;
/**
* 提示消息
*/
private String msg;
/**
* 结果集
*/
private List<T> data;
/**
* 合计内容
*/
private T totalRow;
/**
* 合计内容需要忽略的字段
*/
public static List<String> ignoreFieldNames;
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
this.count = Long.valueOf(data.size());
if (!CommonUtils.ListIsNullOrEmpty(data)) {
try {
// 通过反射获取model的真实类型
Class<T> clazz = (Class<T>) data.get(0).getClass();
// 通过反射创建model的实例
totalRow = clazz.newInstance();
// 计算每列数据合计
this.totalRow = CommonUtils.setSumListsToBeanIgnore(totalRow, data, ignoreFieldNames);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public static <T> ResultReport<T> of(List<T> datas, Integer code, String msg) {
ResultReport result = new ResultReport();
result.code = code;
result.setData(datas);
result.msg = msg;
return result;
}
public static <T> ResultReport<T> result(List<T> model) {
if (!CommonUtils.isNullOrEmpty(model)) {
return of(model, CodeEnum.SUCCESS.getCode(), "成功!");
} else {
return of(null, CodeEnum.ERROR.getCode(), "失败!");
}
}
}
数据求和方法
/**
*
* @param <T>
* @param all 返回总和Bean
* @param list 求和数据
* @param ignoreFieldNames 忽略求和字段
* @return
*/
public static <T> T setSumListsToBeanIgnore(T all,List <T> list,List<String> ignoreFieldNames){
Field[] fields = all.getClass().getDeclaredFields();
for(int i=0;i<fields.length;i++) {
try {
String field = fields[i].getName();
if(ignoreFieldNames.contains(field)) {
continue;
}
Integer intFieldAll = 0;
BigDecimal bigFieldAll = BigDecimal.ZERO;
Double doubleFieldAll = 0.0;
for(Object bean :list) {
fields[i].setAccessible(true);
Object value = fields[i].get(bean);
if (value instanceof Integer) {
intFieldAll = intFieldAll+(Integer)value;
}else if(value instanceof BigDecimal) {
bigFieldAll = bigFieldAll.add((BigDecimal)value);
}else if(value instanceof Double) {
doubleFieldAll = doubleFieldAll + (Double)value;
}else {
intFieldAll = -1;
bigFieldAll = null;
break;
}
}
if(bigFieldAll != null && intFieldAll != -1 && doubleFieldAll != -1) {
if(intFieldAll > 0) {
BeanUtils.setProperty(all,field,intFieldAll);
}else if(bigFieldAll.doubleValue() > 0) {
BeanUtils.setProperty(all,field,bigFieldAll);
}else if(doubleFieldAll > 0) {
BeanUtils.setProperty(all,field,doubleFieldAll);
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
return all;
}
调用示例
// 忽略不参加计算的属性名称集合
List<String> ignoreFieldNames = new ArrayList<>();
ignoreFieldNames.add("name");
ResultReport.ignoreFieldNames = ignoreFieldNames;
List<OrderBaseReportDto> datas = orderInfoMapper.getOrderReport(params);
return ResultReport.result(datas);