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.*;
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;
/**
*
* 能源类型-能耗抄表明细 服务实现类
*
*
* @author 芯导软件(江苏)有限公司
* @since 2026-03-10 11:22:20
*/
@Service
public class EnergyConsumptionDetailServiceImpl extends ServiceImpl implements EnergyConsumptionDetailService {
@Autowired
private EnergyConsumptionDetailMapper energyConsumptionDetailMapper;
@Autowired
private EnergyMapper energyMapper;
@Override
public IPage pageEnergyConsumptionDetail(Page page, EnergyConsumptionDetailDto energyConsumptionDetailDto) {
return energyConsumptionDetailMapper.pageEnergyConsumptionDetail(page,energyConsumptionDetailDto);
}
@Override
public R importData(MultipartFile file) {
try {
ExcelUtil util = new ExcelUtil(EnergyConsumptionDetailDto.class);
List energyConsumptionDetailDtoList = util.importExcel(file.getInputStream());
if(CollectionUtils.isEmpty(energyConsumptionDetailDtoList)){
return R.fail("模板错误或导入数据为空");
}
List 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 = energyMapper.selectList(Wrappers.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 list = energyConsumptionDetailMapper.pageEnergyConsumptionDetail(new Page<>(-1,-1),new EnergyConsumptionDetailDto()).getRecords();
if(CollectionUtils.isEmpty(list)){
throw new RuntimeException("无导出数据");
}
ExcelUtil util = new ExcelUtil<>(EnergyConsumptionDetailDto.class);
util.exportExcel(response, list, "能耗抄表");
}
@Override
public EnergyStatisticsDto statistics(EnergyStatisticsVo energyStatisticsVo) {
EnergyStatisticsDto energyStatisticsDto = new EnergyStatisticsDto();
//计算总耗用量+总能耗费用
Map 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 oldmap=energyConsumptionDetailMapper.calculateEnergy(oldenergyStatisticsVo);
if (ObjectUtils.isNotEmpty(oldmap)) {
BigDecimal subtract = map.get("totalEnergyConsumption").subtract(oldmap.get("totalEnergyConsumption"));
BigDecimal changeVite=BigDecimal.ZERO;
if (oldmap.get("totalEnergyConsumption").compareTo(BigDecimal.ZERO)>0){
changeVite = (subtract).divide(oldmap.get("totalEnergyConsumption"), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
}
energyStatisticsDto.setChangeVite(changeVite);
}
//能耗类型占比
List energyConsumptionTypeDtos=energyConsumptionDetailMapper.energyConsumptionTypeProportion(energyStatisticsVo);
energyStatisticsDto.setEnergyConsumptionTypeProportion(energyConsumptionTypeDtos);
//能耗明细
List energyCostDtos=energyConsumptionDetailMapper.energyCostDtos(energyStatisticsVo);
energyStatisticsDto.setEnergyCostDtos(energyCostDtos);
return energyStatisticsDto;
}
@Override
public EnergyAccountDto account(EnergyStatisticsVo energyStatisticsVo) {
EnergyAccountDto energyAccountDto = new EnergyAccountDto();
//计算总能耗成本+生产能耗成本+办公能耗成本
Map map=energyConsumptionDetailMapper.calculateEnergy(energyStatisticsVo);
energyAccountDto.setTotalEnergyCost(map.get("totalEnergyCost"));//总能耗成本
energyStatisticsVo.setType("生产");
Map map1=energyConsumptionDetailMapper.calculateEnergy(energyStatisticsVo);
energyAccountDto.setProductEnergyCost(map1.get("totalEnergyCost"));//生产能耗成本
energyStatisticsVo.setType("办公");
Map map2=energyConsumptionDetailMapper.calculateEnergy(energyStatisticsVo);
energyAccountDto.setOfficeEnergyCost(map2.get("totalEnergyCost"));//办公能耗成本
energyStatisticsVo.setType(null);//恢复查询全部
//平均成本
energyAccountDto.setAverageEnergyCost(energyAccountDto.getTotalEnergyCost().divide(new BigDecimal(energyStatisticsVo.getDays()),2, RoundingMode.HALF_UP));
//能耗成本趋势
List energyAccountTypeDtos=energyConsumptionDetailMapper.energyAccountTypeDtos(energyStatisticsVo);
energyAccountDto.setEnergyAccountTypeDtos(energyAccountTypeDtos);
//能耗类型成本占比
List energyConsumptionTypeDtos=energyConsumptionDetailMapper.energyConsumptionTypeProportion(energyStatisticsVo);
energyAccountDto.setEnergyConsumptionTypeProportion(energyConsumptionTypeDtos);
//能耗类型明细
List energyConsumptionDetailDtoList=energyConsumptionDetailMapper.energyConsumptionDetailDtos(energyStatisticsVo);
energyAccountDto.setEnergyConsumptionDetailDtoList(energyConsumptionDetailDtoList);
return energyAccountDto;
}
}