云
2 天以前 657698fd2fb32794932474648dbaee9e284e38c8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package cn.iocoder.yudao.module.mes.dal.mysql.energy;
 
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.energy.vo.EnergyRecordPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.energy.vo.EnergyAnalysisReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.energy.EnergyRecordDO;
import lombok.Data;
import org.apache.ibatis.annotations.*;
import java.math.BigDecimal;
import java.util.List;
 
@Mapper
public interface EnergyRecordMapper extends BaseMapperX<EnergyRecordDO> {
    @Select("""
        <script>
        SELECT COALESCE(SUM(<choose><when test="rule.metric == 'AMOUNT' or rule.metric == 'MONTH_AMOUNT'">amount</when><otherwise>quantity</otherwise></choose>),0)
        FROM mes_energy_record WHERE deleted=0 AND energy_type=#{rule.energyType}
        <choose><when test="rule.metric == 'MONTH_QUANTITY' or rule.metric == 'MONTH_AMOUNT'">
        AND record_date &gt;= #{date} AND record_date &lt; DATE_ADD(#{date}, INTERVAL 1 MONTH)
        </when><otherwise>AND record_date=#{date}</otherwise></choose>
        <if test="rule.usageArea != null and rule.usageArea != ''">AND usage_area=#{rule.usageArea}</if>
        <if test="rule.productCategory != null and rule.productCategory != ''">AND product_category=#{rule.productCategory}</if>
        </script>
        """)
    BigDecimal selectDailyValue(@Param("date") java.time.LocalDate date,
            @Param("rule") cn.iocoder.yudao.module.mes.dal.dataobject.energy.EnergyAlertRuleDO rule);
    default PageResult<EnergyRecordDO> selectPage(EnergyRecordPageReqVO req) {
        return selectPage(req, new LambdaQueryWrapperX<EnergyRecordDO>()
                .geIfPresent(EnergyRecordDO::getRecordDate, req.getStartDate())
                .leIfPresent(EnergyRecordDO::getRecordDate, req.getEndDate())
                .eqIfPresent(EnergyRecordDO::getEnergyType, req.getEnergyType())
                .likeIfPresent(EnergyRecordDO::getUsageArea, req.getUsageArea())
                .eqIfPresent(EnergyRecordDO::getProductCategory, req.getProductCategory())
                .orderByDesc(EnergyRecordDO::getRecordDate, EnergyRecordDO::getId));
    }
 
    // 按数据库分组,避免加载全部台账;租户拦截器自动添加 tenant_id 条件。
    @Select("""
        <script>
        SELECT energy_type AS energyType,
          <choose><when test="req.groupBy == 'MONTH'">DATE_FORMAT(record_date, '%Y-%m')</when>
          <otherwise>DATE_FORMAT(record_date, '%Y-%m-%d')</otherwise></choose> AS period,
          usage_area AS usageArea, SUM(quantity) AS quantity, SUM(amount) AS amount,
          COUNT(*) AS recordCount
        FROM mes_energy_record
        WHERE deleted = 0 AND record_date BETWEEN #{req.startDate} AND #{req.endDate}
        <if test="req.energyType != null and req.energyType != ''">AND energy_type = #{req.energyType}</if>
        <if test="req.usageArea != null and req.usageArea != ''">AND usage_area LIKE CONCAT('%', #{req.usageArea}, '%')</if>
        <if test="req.productCategory != null and req.productCategory != ''">AND product_category = #{req.productCategory}</if>
        GROUP BY energy_type, period, usage_area
        ORDER BY period, energy_type, usage_area
        </script>
        """)
    List<Aggregate> selectAnalysis(@Param("req") EnergyAnalysisReqVO req);
 
    @Data
    class Aggregate {
        private String energyType;
        private String period;
        private String usageArea;
        private BigDecimal quantity;
        private BigDecimal amount;
        private long recordCount;
    }
}