package cn.iocoder.yudao.module.mes.dal.mysql.em.record; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.mes.controller.admin.em.record.vo.MesEmRecordPageReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.em.record.MesEmRecordDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; import java.util.Map; /** * MES 能耗抄表记录 Mapper * * @author 超级管理员 */ @Mapper public interface MesEmRecordMapper extends BaseMapperX { default PageResult selectPage(MesEmRecordPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(MesEmRecordDO::getMeterId, reqVO.getMeterId()) .likeIfPresent(MesEmRecordDO::getMeterName, reqVO.getMeterName()) .eqIfPresent(MesEmRecordDO::getEnergyType, reqVO.getEnergyType()) .eqIfPresent(MesEmRecordDO::getWorkshopId, reqVO.getWorkshopId()) .eqIfPresent(MesEmRecordDO::getSource, reqVO.getSource()) .betweenIfPresent(MesEmRecordDO::getRecordDate, reqVO.getRecordDate()) .orderByDesc(MesEmRecordDO::getRecordDate) .orderByDesc(MesEmRecordDO::getId)); } default MesEmRecordDO selectByMeterIdAndDate(Long meterId, LocalDate recordDate) { return selectOne(new LambdaQueryWrapperX() .eq(MesEmRecordDO::getMeterId, meterId) .eq(MesEmRecordDO::getRecordDate, recordDate)); } default MesEmRecordDO selectLastByMeterId(Long meterId, LocalDate beforeDate, Long excludeId) { return selectOne(new LambdaQueryWrapperX() .eq(MesEmRecordDO::getMeterId, meterId) .lt(MesEmRecordDO::getRecordDate, beforeDate) .ne(excludeId != null, MesEmRecordDO::getId, excludeId) .orderByDesc(MesEmRecordDO::getRecordDate) .orderByDesc(MesEmRecordDO::getId) .last("LIMIT 1")); } default List selectListByMeterIdAndDateRange(Long meterId, LocalDate begin, LocalDate end) { return selectList(new LambdaQueryWrapperX() .eq(MesEmRecordDO::getMeterId, meterId) .between(MesEmRecordDO::getRecordDate, begin, end)); } /** * 统计某个考核对象在指定区间内的用量 * * @param objectType 0 全厂 / 1 车间 / 2 产线 / 3 设备 */ @Select(""" """) BigDecimal sumUsage(@Param("energyType") Integer energyType, @Param("objectType") Integer objectType, @Param("objectId") Long objectId, @Param("begin") LocalDate begin, @Param("end") LocalDate end); @Select(""" SELECT COALESCE(SUM(usage_amount), 0) FROM mes_em_record WHERE deleted = 0 AND meter_id = #{meterId} AND record_date BETWEEN #{begin} AND #{end} """) BigDecimal sumMeterUsage(@Param("meterId") Long meterId, @Param("begin") LocalDate begin, @Param("end") LocalDate end); @Select(""" SELECT COALESCE(SUM(usage_amount), 0) FROM mes_em_record WHERE deleted = 0 AND energy_type = #{energyType} AND record_date BETWEEN #{begin} AND #{end} """) BigDecimal sumTypeUsage(@Param("energyType") Integer energyType, @Param("begin") LocalDate begin, @Param("end") LocalDate end); default List selectListByDateRange(LocalDate begin, LocalDate end) { return selectList(new LambdaQueryWrapperX() .between(MesEmRecordDO::getRecordDate, begin, end) .orderByAsc(MesEmRecordDO::getRecordDate) .orderByAsc(MesEmRecordDO::getId)); } // ==================== 统计查询 ==================== default List> selectTypeStats(LocalDate begin, LocalDate end) { return selectMaps(new QueryWrapper() .select("energy_type AS energyType", "COALESCE(SUM(usage_amount), 0) AS usageAmount", "COALESCE(SUM(cost), 0) AS costAmount", "COALESCE(SUM(usage_amount * coal_factor) / 1000, 0) AS tce") .between("record_date", begin, end) .groupBy("energy_type") .orderByAsc("energy_type")); } default List> selectWorkshopStats(LocalDate begin, LocalDate end) { return selectMaps(new QueryWrapper() .select("workshop_id AS workshopId", "workshop_name AS workshopName", "COALESCE(SUM(usage_amount * coal_factor) / 1000, 0) AS tce", "COALESCE(SUM(cost), 0) AS costAmount") .between("record_date", begin, end) .isNotNull("workshop_id") .groupBy("workshop_id", "workshop_name") .orderByDesc("tce")); } default List> selectTrendRows(LocalDate begin, LocalDate end) { return selectMaps(new QueryWrapper() .select("record_date AS recordDate", "energy_type AS energyType", "COALESCE(SUM(usage_amount), 0) AS usageAmount", "COALESCE(SUM(cost), 0) AS costAmount", "COALESCE(SUM(usage_amount * coal_factor) / 1000, 0) AS tce") .between("record_date", begin, end) .groupBy("record_date", "energy_type") .orderByAsc("record_date")); } default List> selectTopMeterStats(LocalDate begin, LocalDate end, int limit) { return selectMaps(new QueryWrapper() .select("meter_id AS meterId", "meter_name AS meterName", "energy_type AS energyType", "unit AS unit", "COALESCE(SUM(usage_amount), 0) AS usageAmount", "COALESCE(SUM(cost), 0) AS costAmount", "COALESCE(SUM(usage_amount * coal_factor) / 1000, 0) AS tce") .between("record_date", begin, end) .groupBy("meter_id", "meter_name", "energy_type", "unit") .orderByDesc("tce") .last("LIMIT " + limit)); } default Long selectCountByMeterId(Long meterId) { return selectCount(new LambdaQueryWrapperX() .eq(MesEmRecordDO::getMeterId, meterId)); } }