package com.jiayue.ipfcst.console.service; import com.jiayue.ipfcst.common.data.entity.WindTowerStatusData; import com.jiayue.ipfcst.common.data.repository.WindTowerStatusDataRepository; import com.jiayue.ipfcst.common.data.service.BaseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.persistence.criteria.Predicate; import java.lang.reflect.Field; import java.util.*; /** * 测风塔数据业务层 * * @author yh * @version 1.0 * @since 2019/8/5 16:02 */ @Service public class WindTowerStatusDataService extends BaseService { private final WindTowerStatusDataRepository windTowerStatusDataRepository; @Autowired public WindTowerStatusDataService(WindTowerStatusDataRepository windTowerStatusDataRepository) { this.windTowerStatusDataRepository = windTowerStatusDataRepository; } /** * 分页查询 环境监测仪数据 tl * * @param startTime 开始时间 * @param endTime 结束时间 * @param no 设备编号 * @return */ @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true) public Map findByTimeBetweenAndNoAndTimeStep(String stationCode, Date startTime, Date endTime, Integer page, Integer size, String no) { Map map = new HashMap<>(); Sort sort = Sort.by(Sort.Direction.DESC, "time"); Specification specification = this.specificationFindByTime(stationCode, startTime, endTime, no); Pageable pageable = PageRequest.of(page - 1, size, sort); //页码:前端从1开始,jpa从0开始,做个转换 Page windTowerStatusDatas = windTowerStatusDataRepository.findAll(specification, pageable); List datas; datas = windTowerStatusDatas.getContent(); map.put("content", datas);// 结果集 map.put("count", windTowerStatusDatas.getTotalElements());// 总记录数 return map; } /** * 根据时间 分页查询条件 yh * * @param startTime 开始时间 * @param endTime 结束时间 * @return 过滤条件 */ Specification specificationFindByTime(final String stationCode, final Date startTime, final Date endTime, final String no) { return (Specification) (root, criteriaQuery, cb) -> { List predicates = new ArrayList<>(); predicates.add(cb.equal(root.get("stationCode").as(String.class), stationCode)); if (!"ALL".equals(no)) { predicates.add(cb.equal(root.get("equipmentId").as(String.class), no)); } if (startTime != null) { //大于或等于传入时间 predicates.add(cb.greaterThanOrEqualTo(root.get("time").as(Date.class), startTime)); } if (endTime != null) { //小于传入时间 predicates.add(cb.lessThan(root.get("time").as(Date.class), endTime)); } //添加排序的功能 return cb.and(predicates.toArray(new Predicate[predicates.size()])); }; } /** * 查询条件 yh * * @param startTime 开始时间 * @param endTime 结束时间 * @param no 设备编号 * @return 过滤条件 */ Specification Specification(final Date startTime, final Date endTime, final Integer no) { return (Specification) (root, criteriaQuery, cb) -> { List predicates = new ArrayList<>(); if (startTime != null) { //大于或等于传入时间 predicates.add(cb.greaterThanOrEqualTo(root.get("time").as(Date.class), startTime)); } if (endTime != null) { //小于传入时间 predicates.add(cb.lessThan(root.get("time").as(Date.class), endTime)); } if (no != null) { predicates.add(cb.equal(root.get("equipmentNo").as(Integer.class), no)); } //添加排序的功能 return cb.and(predicates.toArray(new Predicate[predicates.size()])); }; } /** * 获取测风塔数据实体所有私有属性名称集合 * * @return 属性名称集合 */ public List getWindTowerStatusDataAttributeName() { List attributeName = new ArrayList<>(); Class windTowerStatusData = WindTowerStatusData.class; Class c = windTowerStatusData; Field[] fs = c.getDeclaredFields(); for (Field f : fs) { attributeName.add(f.getName()); } return attributeName; } }