package com.ruoyi.energy.service.impl;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.ruoyi.common.utils.poi.ExcelUtil;
|
import com.ruoyi.energy.dto.EnergyConsumptionDetailDto;
|
import com.ruoyi.energy.dto.EnergyConsumptionTypeDto;
|
import com.ruoyi.energy.dto.EnergyCostDto;
|
import com.ruoyi.energy.dto.EnergyStatisticsDto;
|
import com.ruoyi.energy.mapper.EnergyMapper;
|
import com.ruoyi.energy.pojo.Energy;
|
import com.ruoyi.energy.pojo.EnergyConsumptionDetail;
|
import com.ruoyi.energy.mapper.EnergyConsumptionDetailMapper;
|
import com.ruoyi.energy.service.EnergyConsumptionDetailService;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.energy.vo.EnergyStatisticsVo;
|
import com.ruoyi.framework.web.domain.R;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import javax.servlet.http.HttpServletResponse;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.time.LocalDate;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.stream.Collectors;
|
|
/**
|
* <p>
|
* 能源类型-能耗抄表明细 服务实现类
|
* </p>
|
*
|
* @author 芯导软件(江苏)有限公司
|
* @since 2026-03-10 11:22:20
|
*/
|
@Service
|
public class EnergyConsumptionDetailServiceImpl extends ServiceImpl<EnergyConsumptionDetailMapper, EnergyConsumptionDetail> implements EnergyConsumptionDetailService {
|
|
@Autowired
|
private EnergyConsumptionDetailMapper energyConsumptionDetailMapper;
|
|
@Autowired
|
private EnergyMapper energyMapper;
|
|
@Override
|
public IPage<EnergyConsumptionDetailDto> pageEnergyConsumptionDetail(Page<EnergyConsumptionDetailDto> page, EnergyConsumptionDetailDto energyConsumptionDetailDto) {
|
return energyConsumptionDetailMapper.pageEnergyConsumptionDetail(page,energyConsumptionDetailDto);
|
}
|
|
@Override
|
public R importData(MultipartFile file) {
|
try {
|
ExcelUtil<EnergyConsumptionDetailDto> util = new ExcelUtil<EnergyConsumptionDetailDto>(EnergyConsumptionDetailDto.class);
|
List<EnergyConsumptionDetailDto> energyConsumptionDetailDtoList = util.importExcel(file.getInputStream());
|
if(CollectionUtils.isEmpty(energyConsumptionDetailDtoList)){
|
return R.fail("模板错误或导入数据为空");
|
}
|
List<EnergyConsumptionDetail> list = energyConsumptionDetailDtoList.stream().map(energyConsumptionDetailDto -> {
|
if (ObjectUtils.isEmpty(energyConsumptionDetailDto)) {
|
throw new RuntimeException("使用模板进行导入");
|
}
|
if (ObjectUtils.isEmpty(energyConsumptionDetailDto.getEnergyTyep()) && ObjectUtils.isEmpty(energyConsumptionDetailDto.getEnergyName())) {
|
throw new RuntimeException("能源类型不能为空");
|
}
|
List<Energy> energy = energyMapper.selectList(Wrappers.<Energy>lambdaQuery()
|
.eq(Energy::getEnergyTyep, energyConsumptionDetailDto.getEnergyTyep())
|
.eq(Energy::getEnergyName, energyConsumptionDetailDto.getEnergyName()));
|
if (CollectionUtils.isEmpty(energy)) {
|
throw new RuntimeException("导入数据中的能源类型在系统中不存在,请先前往能源类型中配置!");
|
}
|
EnergyConsumptionDetail energyConsumptionDetail = new EnergyConsumptionDetail();
|
BeanUtils.copyProperties(energyConsumptionDetailDto, energyConsumptionDetail);
|
energyConsumptionDetail.setEnergyId(energy.get(0).getId());
|
return energyConsumptionDetail;
|
}).collect(Collectors.toList());
|
this.saveOrUpdateBatch(list);
|
return R.ok(true);
|
}catch (Exception e){
|
e.printStackTrace();
|
return R.fail(e.getMessage());
|
}
|
}
|
|
@Override
|
public void export(HttpServletResponse response) {
|
List<EnergyConsumptionDetailDto> list = energyConsumptionDetailMapper.pageEnergyConsumptionDetail(new Page<>(-1,-1),new EnergyConsumptionDetailDto()).getRecords();
|
if(CollectionUtils.isEmpty(list)){
|
throw new RuntimeException("无导出数据");
|
}
|
ExcelUtil<EnergyConsumptionDetailDto> util = new ExcelUtil<>(EnergyConsumptionDetailDto.class);
|
util.exportExcel(response, list, "能耗抄表");
|
}
|
|
@Override
|
public EnergyStatisticsDto statistics(EnergyStatisticsVo energyStatisticsVo) {
|
EnergyStatisticsDto energyStatisticsDto = new EnergyStatisticsDto();
|
//计算总耗用量+总能耗费用
|
Map<String, BigDecimal> map=energyConsumptionDetailMapper.calculateEnergy(energyStatisticsVo);
|
energyStatisticsDto.setTotalEnergyConsumption(map.get("totalEnergyConsumption"));
|
energyStatisticsDto.setTotalEnergyCost(map.get("totalEnergyCost"));
|
//平均用量
|
energyStatisticsDto.setAverageConsumption(energyStatisticsDto.getTotalEnergyConsumption().divide(new BigDecimal(energyStatisticsVo.getDays()),2, RoundingMode.HALF_UP));
|
//环比变化=(本期值 - 上期值) / 上期值 * 100
|
LocalDate minDays = energyStatisticsVo.getStartDate().minusDays(energyStatisticsVo.getDays());
|
LocalDate masDays = energyStatisticsVo.getEndDate().minusDays(energyStatisticsVo.getDays());
|
EnergyStatisticsVo oldenergyStatisticsVo = new EnergyStatisticsVo();
|
BeanUtils.copyProperties(energyStatisticsVo,oldenergyStatisticsVo);
|
oldenergyStatisticsVo.setStartDate(minDays);
|
oldenergyStatisticsVo.setEndDate(masDays);
|
Map<String, BigDecimal> oldmap=energyConsumptionDetailMapper.calculateEnergy(oldenergyStatisticsVo);
|
if (ObjectUtils.isNotEmpty(oldmap)) {
|
BigDecimal changeVite = (map.get("totalEnergyConsumption").subtract(oldmap.get("totalEnergyConsumption"))).divide(oldmap.get("totalEnergyConsumption"), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
|
energyStatisticsDto.setChangeVite(changeVite);
|
}
|
//能耗类型占比
|
List<EnergyConsumptionTypeDto> energyConsumptionTypeDtos=energyConsumptionDetailMapper.energyConsumptionTypeProportion(energyStatisticsVo);
|
energyStatisticsDto.setEnergyConsumptionTypeProportion(energyConsumptionTypeDtos);
|
//能耗明细
|
List<EnergyCostDto> energyCostDtos=energyConsumptionDetailMapper.energyCostDtos(energyStatisticsVo);
|
energyStatisticsDto.setEnergyCostDtos(energyCostDtos);
|
return energyStatisticsDto;
|
}
|
}
|