一.查询需要导出的数据
@GetMapping("/exportAuditLog")
@PreAuthorize("hasRole('HIT_FINANCE')")
public void export(AuditEventLogSearchRequest auditrequest, @OTPCodeInfo OneTimeCode oneTimeCode,
SessionStatus status, HttpServletResponse response) throws Exception {
Assert.notNull(oneTimeCode, "one time code can't empty or null");
oneTimeCode.validationOtpCode();
String principal = auditrequest.getPrincipal();
String timemin = auditrequest.getTimemin();
String timemax = auditrequest.getTimemax();
String type = auditrequest.getType();
// params
Map<String, String> params = new HashMap<>();
params.put("principal", principal);
params.put("timemin", timemin);
params.put("timemax", timemax);
params.put("type", type);
// add sort
List<Sort.Order> orderList = new ArrayList<>();
if (auditrequest.getCompositors() != null && auditrequest.getCompositors().size() != 0) {
for (Compositor compositor : auditrequest.getCompositors()) {
Sort.Order orders = new Sort.Order(compositor.getDirection(), compositor.getProperty());
orderList.add(orders);
}
}
else {
Sort.Order order = Sort.Order.desc("timeStamp");
orderList.add(order);
}
Page<Audit> auditContent = auditTrailLogService.searchAuditTrailLog(params, null);
List<Audit> auditlogcontent = auditContent.getContent();
String filename = "Auditlogload.csv";
HttpHeaders headers = new HttpHeaders();
// 下载显示的文件名,解决中文名称乱码问
String downloadFielName = new String(filename.getBytes("UTF-8"), "UTF-8");
// 通知浏览器以attachment(下载方式)打开图片
headers.setContentDispositionFormData("attachment", downloadFielName);
// application/octet-stream 二进制流数据(最常见的文件下载)
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
String utf = "UTF-8";
response.setContentType("application/ms-excel.numberformat:@");
response.setCharacterEncoding(utf);
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "max-age=30");
response.setHeader("Content-Disposition", "attachment; filename=" + downloadFielName);
process(auditlogcontent, response);
String typelog = "Export Log";
String message = "Export Log";
auditEventLog.addAuditLog(typelog, message);
}
public void process(List<Audit> datalist, HttpServletResponse response) throws IOException {
OutputStream output = response.getOutputStream();
CsvWriter csvWriter = new CsvWriter(output, ',', Charset.forName("UTF-8"));
String[] tableheader = { "Date Time", "User Name", "Event", "Log Details" };
csvWriter.writeRecord(tableheader);
for (Audit data : datalist) {
String[] arr = new String[4];
arr[0] = data.getTimeStamp().toString();
arr[1] = data.getPrincipal();
arr[2] = data.getType();
arr[3] = data.getData();
csvWriter.writeRecord(arr);
}
csvWriter.close();
output.close();
}
Service:
@Service
public class AuditTrailLogServiceImpl implements AuditTrailLogService {
@Autowired
private AuditRepository auditRepository;
@Override
public PageImpl<Audit> searchAuditTrailLog(Map<String, String> params, Pageable pageable) {
return auditRepository.searchAuditSearchLog(params, pageable);
}
}
Dao:
@Override
@Transactional
public PageImpl<Audit> searchAuditSearchLog(Map<String, String> params, Pageable pageable) {
Long count = countByCondition(params);
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Audit> cq = cb.createQuery(Audit.class);
Root<Audit> root = cq.from(Audit.class);
List<Predicate> predicates = buildQueryPredicate(params, root, cb);
if (!predicates.isEmpty()) {
cq.where(predicates.toArray(new Predicate[0]));
}
List<Order> sortOrder;
if (pageable != null) {
sortOrder = QueryUtils.toOrders(pageable.getSort(), root, cb);
}
else {
Sort.Order orderId = Sort.Order.desc("timeStamp");
List<Sort.Order> orders = new ArrayList<>();
orders.add(orderId);
sortOrder = QueryUtils.toOrders(Sort.by(orders), root, cb);
}
cq.orderBy(sortOrder);
TypedQuery<Audit> query = entityManager.createQuery(cq);
List<Audit> auditList;
if (pageable != null) {
query.setMaxResults(pageable.getPageSize());
query.setFirstResult((int) pageable.getOffset());
auditList = query.getResultList();
return new PageImpl<>(auditList, pageable, count);
}
auditList = query.getResultList();
return new PageImpl<>(auditList);
}
@Override
@Transactional
public Long countByCondition(Map<String, String> params) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<Audit> root = cq.from(Audit.class);
cq.select(cb.count(root));
List<Predicate> predicateList = buildQueryPredicate(params, root, cb);
if (!predicateList.isEmpty()) {
cq.where(predicateList.toArray(new Predicate[0]));
}
return entityManager.createQuery(cq).getSingleResult();
}
private List<Predicate> buildQueryPredicate(Map<String, String> params, Root<Audit> root, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
String type = params.get("type");
String timemin = params.get("timemin");
String timemax = params.get("timemax");
String principal = params.get("principal");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date datetimeF = null;
Date datetimeT = null;
try {
datetimeF = sdf.parse(timemin);
datetimeT = sdf.parse(timemax);
}
catch (ParseException e) {
e.getMessage();
}
Timestamp timestampF = new Timestamp(datetimeF.getTime());
Timestamp timestampT = new Timestamp(datetimeT.getTime());
if (!StringUtils.isEmpty(type)) {
predicates.add(cb.equal(root.get("type"), type));
}
if (!StringUtils.isEmpty(principal)) {
predicates.add(cb.like(root.get("principal"), "%" + principal + "%"));
}
if (!StringUtils.isEmpty(timemin)) {
predicates.add(cb.greaterThanOrEqualTo(root.get("timeStamp").as(String.class), timestampF.toString()));
}
if (!StringUtils.isEmpty(timemax)) {
String timeTo = timestampT.toString();
String[] plit = timeTo.split(" ");
timeTo = plit[0] + " 23:59:59";
predicates.add(cb.lessThanOrEqualTo(root.get("timeStamp").as(String.class), timeTo));
}
return predicates;
}