zhitan-cloud
2024-08-29 8eeb34c0adcaaa2b56311fc6d8fdf454d82ac700
!1 fix bug
Merge pull request !1 from zhitan-cloud/develop1.0
已添加44个文件
已修改8个文件
3853 ■■■■ 文件已修改
data-model/src/main/resources/mybatis/basicsetting/ModelNodeMapper.xml 640 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/controller/ElectricityDataItemController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/controller/ElectricityTypeSettingController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/dto/ElectricityDataItemListDTO.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/dto/ElectricityTypeSettingAddVO.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/dto/ElectricityTypeSettingItemAddVO.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/dto/ElectricityTypeSettingItemUpdateVO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/dto/ElectricityTypeSettingUpdateVO.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/entity/ElectricityDataItem.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/entity/ElectricityTypeSetting.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/entity/ElectricityTypeSettingItem.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/enums/ElectricityTypeEnum.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/vo/ElectricityPeriodFeeDetailVO.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/vo/ElectricityTypeSettingItemQueryVO.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/vo/ElectricityTypeSettingItemVO.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/vo/ElectricityTypeSettingPageListVO.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/vo/PeakAndValleyReportVO.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/mapper/ElectricityDataItemMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/mapper/ElectricityTypeSettingItemMapper.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/mapper/ElectricityTypeSettingMapper.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/service/IElectricityDataItemService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/service/IElectricityTypeSettingService.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/service/impl/ElectricityDataItemServiceImpl.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/service/impl/ElectricityTypeSettingServiceImpl.java 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/resources/mybatis/electricityTypeSetting/ElectricityDataItemMapper.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/resources/mybatis/electricityTypeSetting/ElectricityTypeSettingItemMapper.xml 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_server/src/main/resources/mybatis/electricityTypeSetting/ElectricityTypeSettingMapper.xml 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/api/energyPrice/price.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/home/homeiconD.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/home/homeiconDQ.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/home/homeiconJ.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/home/homeiconT.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/home/homeiconW.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/home/homeiconY.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/home/homeicontitle.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/icons/checkbox.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/icons/checked.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/image/bg.jpg 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/image/breadcrumbBg.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/image/isbreadcrumbBg.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/image/navbar/Group.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/assets/image/treeBg.png 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/layout/index.vue 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/views/electricityPrice/statistics/electricityIndexNew.vue 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/views/energyPrice/index copy.vue 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/views/energyPrice/index.vue 558 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/views/index copy.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/views/index.vue 260 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/views/index_bak.vue 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/src/views/login.vue 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
energy_management_ui/vue.config.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
data-model/src/main/resources/mybatis/basicsetting/ModelNodeMapper.xml
@@ -1,344 +1,342 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dingzhuo.energy.data.model.mapper.ModelNodeMapper">
  <resultMap type="com.dingzhuo.energy.data.model.domain.ModelNode" id="ModelNodeResult">
    <result property="nodeId" column="node_id"/>
    <result property="code" column="code"/>
    <result property="name" column="name"/>
    <result property="parentId" column="parent_id"/>
    <result property="address" column="address"/>
    <result property="modelCode" column="model_code"/>
    <result property="nodeCategory" column="node_category"/>
  </resultMap>
    <resultMap type="com.dingzhuo.energy.data.model.domain.ModelNode" id="ModelNodeResult">
        <result property="nodeId" column="node_id"/>
        <result property="code" column="code"/>
        <result property="name" column="name"/>
        <result property="parentId" column="parent_id"/>
        <result property="address" column="address"/>
        <result property="modelCode" column="model_code"/>
        <result property="nodeCategory" column="node_category"/>
    </resultMap>
  <sql id="selectModelNodeVo">
    select node_id, code, name, parent_id, address, model_code, node_category
    from model_node
  </sql>
    <sql id="selectModelNodeVo">
        select node_id, code, name, parent_id, address, model_code, node_category
        from model_node
    </sql>
  <select id="selectModelNodeList"
    parameterType="com.dingzhuo.energy.data.model.domain.ModelNode"
    resultMap="ModelNodeResult">
    <include refid="selectModelNodeVo"/>
    <where>
      <if test="code != null  and code != ''">and code like concat('%', #{code}, '%')</if>
      <if test="name != null  and name != ''">and name like concat('%', #{name}, '%')</if>
    </where>
    order by order_num
  </select>
    <select id="selectModelNodeList"
            parameterType="com.dingzhuo.energy.data.model.domain.ModelNode"
            resultMap="ModelNodeResult">
        <include refid="selectModelNodeVo"/>
        <where>
            <if test="code != null  and code != ''">and code like concat('%', #{code}, '%')</if>
            <if test="name != null  and name != ''">and name like concat('%', #{name}, '%')</if>
        </where>
        order by order_num
    </select>
  <select id="selectModelNodeById" parameterType="String" resultMap="ModelNodeResult">
    <include refid="selectModelNodeVo"/>
    where node_id = #{nodeId}
  </select>
  <select id="getModelNodeByModelCode" resultMap="ModelNodeResult">
    <include refid="selectModelNodeVo"/>
    where model_code = #{modelCode}
    order by order_num
  </select>
  <select id="getMaxOrder" resultType="java.lang.Integer">
    select COALESCE(max(order_num), 0)
    from model_node
    where parent_id = #{parentId}
  </select>
  <select id="modelNodeHasExist" resultType="java.lang.Integer">
    select count(*)
    from model_node
    where code = #{code}
      and model_code = #{modelCode};
  </select>
  <select id="modelNodeHasExistWhenUpdate" resultType="java.lang.Integer">
    select count(*)
    from model_node
    where code = #{code}
      and model_code = #{modelCode}
      AND node_id != #{nodeId};
  </select>
  <select id="getSettingDevice"
    resultType="com.dingzhuo.energy.basic.data.meter.domain.MeterImplement">
    select id, code, meter_name as meterName
    from meter_implement m
           left join node_device nd on m.id = nd.device_id
    where nd.node_id = #{nodeId};
  </select>
  <select id="getSettingIndex"
    resultType="com.dingzhuo.energy.data.model.domain.EnergyIndex">
    select ei.index_id as indexId, code, name, index_type as indexType
    from energy_index ei
           left join node_index ni on ei.index_id = ni.index_id
    where ni.node_id = #{nodeId}
  </select>
  <select id="getSettingEnergy"
    resultType="com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnergy">
    select enerid, enersno, enername
    from sys_energy e
           left join node_energy ne on e.enerid = ne.energy_id
    where ne.node_id = #{nodeId};
  </select>
  <select id="getSettingProduct"
    resultType="com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct">
    select productid, productsno, productname
    from sys_product p
           left join node_product np on p.productid = np.product_id
    where np.node_id = #{nodeId};
  </select>
  <select id="getSettingIndexByType"
    resultType="com.dingzhuo.energy.data.model.domain.EnergyIndex">
    select ei.index_id as indexId, code, name, index_type as indexType
    from energy_index ei
           left join node_index ni on ei.index_id = ni.index_id
    where ni.node_id = #{nodeId}
      and ei.index_type = #{indexType}
  </select>
  <select id="getModelNodeByNodeCodes" resultMap="ModelNodeResult">
    <include refid="selectModelNodeVo"/>
    where code in
    <foreach item="nodeCode" collection="list" open="(" separator="," close=")">
      #{nodeCode}
    </foreach>
    order by order_num
  </select>
  <select id="getModelNodeByModelCodeWithAuth" resultMap="ModelNodeResult">
    <include refid="selectModelNodeVo"/>
    where model_code = #{modelCode}
    and (
      node_id in (
    <select id="selectModelNodeById" parameterType="String" resultMap="ModelNodeResult">
        <include refid="selectModelNodeVo"/>
        where node_id = #{nodeId}
    </select>
    <select id="getModelNodeByModelCode" resultMap="ModelNodeResult">
        <include refid="selectModelNodeVo"/>
        where model_code = #{modelCode}
        order by order_num
    </select>
    <select id="getMaxOrder" resultType="java.lang.Integer">
        select COALESCE(max(order_num), 0)
        from model_node
        where parent_id = #{parentId}
    </select>
    <select id="modelNodeHasExist" resultType="java.lang.Integer">
        select count(*)
        from model_node
        where code = #{code}
          and model_code = #{modelCode};
    </select>
    <select id="modelNodeHasExistWhenUpdate" resultType="java.lang.Integer">
        select count(*)
        from model_node
        where code = #{code}
          and model_code = #{modelCode}
          AND node_id != #{nodeId};
    </select>
    <select id="getSettingDevice"
            resultType="com.dingzhuo.energy.basic.data.meter.domain.MeterImplement">
        select id, code, meter_name as meterName
        from meter_implement m
                 left join node_device nd on m.id = nd.device_id
        where nd.node_id = #{nodeId};
    </select>
    <select id="getSettingIndex"
            resultType="com.dingzhuo.energy.data.model.domain.EnergyIndex">
        select ei.index_id as indexId, code, name, index_type as indexType
        from energy_index ei
                 left join node_index ni on ei.index_id = ni.index_id
        where ni.node_id = #{nodeId}
    </select>
    <select id="getSettingEnergy"
            resultType="com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnergy">
        select enerid, enersno, enername
        from sys_energy e
                 left join node_energy ne on e.enerid = ne.energy_id
        where ne.node_id = #{nodeId};
    </select>
    <select id="getSettingProduct"
            resultType="com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct">
        select productid, productsno, productname
        from sys_product p
                 left join node_product np on p.productid = np.product_id
        where np.node_id = #{nodeId};
    </select>
    <select id="getSettingIndexByType"
            resultType="com.dingzhuo.energy.data.model.domain.EnergyIndex">
        select ei.index_id as indexId, code, name, index_type as indexType
        from energy_index ei
                 left join node_index ni on ei.index_id = ni.index_id
        where ni.node_id = #{nodeId}
          and ei.index_type = #{indexType}
    </select>
    <select id="getModelNodeByNodeCodes" resultMap="ModelNodeResult">
        <include refid="selectModelNodeVo"/>
        where code in
        <foreach item="nodeCode" collection="list" open="(" separator="," close=")">
            #{nodeCode}
        </foreach>
        order by order_num
    </select>
    <select id="getModelNodeByModelCodeWithAuth" resultMap="ModelNodeResult">
        <include refid="selectModelNodeVo"/>
        where model_code = #{modelCode}
        and (
        node_id in (
        select node_id from data_auth_user where user_id = #{userId} and model_code = #{modelCode}
      )
      or node_id in (
        )
        or node_id in (
        select node_id from data_auth_role where role_id in (
          select cast(r.role_id as varchar) from sys_role r
          left join sys_user_role ur on ur.role_id = r.role_id
          left join sys_user u on u.user_id = ur.user_id
          where cast(u.user_id as VARCHAR) = #{userId}
        select cast(r.role_id as varchar) from sys_role r
        left join sys_user_role ur on ur.role_id = r.role_id
        left join sys_user u on u.user_id = ur.user_id
        where cast(u.user_id as VARCHAR) = #{userId}
        ) and model_code = #{modelCode}
      )
    )
    order by order_num
  </select>
        )
        )
        order by order_num
    </select>
  <insert id="insertModelNode"
    parameterType="com.dingzhuo.energy.data.model.domain.ModelNode">
    insert into model_node
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="nodeId != null  and nodeId != ''">node_id,</if>
      <if test="code != null  and code != ''">code,</if>
      <if test="name != null  and name != ''">name,</if>
      <if test="parentId != null  and parentId != ''">parent_id,</if>
      <if test="address != null  and address != ''">address,</if>
      <if test="modelCode != null  and modelCode != ''">model_code,</if>
      <if test="nodeCategory != null  and nodeCategory != ''">node_category,</if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="nodeId != null  and nodeId != ''">#{nodeId},</if>
      <if test="code != null  and code != ''">#{code},</if>
      <if test="name != null  and name != ''">#{name},</if>
      <if test="parentId != null  and parentId != ''">#{parentId},</if>
      <if test="address != null  and address != ''">#{address},</if>
      <if test="modelCode != null  and modelCode != ''">#{modelCode},</if>
      <if test="nodeCategory != null  and nodeCategory != ''">#{nodeCategory},</if>
    </trim>
  </insert>
  <insert id="setDevice">
    delete
    from node_device
    where node_id = #{nodeId};
    <foreach collection="deviceIds" item="deviceId" separator=";">
      insert into node_device (node_id, device_id)
      values (#{nodeId}, #{deviceId})
    </foreach>
  </insert>
  <insert id="setEnergy">
    delete
    from node_energy
    where node_id = #{nodeId};
    <foreach collection="energyIds" item="energyId" separator=";">
      insert into node_energy (node_id, energy_id)
      values (#{nodeId}, #{energyId})
    </foreach>
  </insert>
  <insert id="setProduct">
    delete
    from node_product
    where node_id = #{nodeId};
    <foreach collection="productIds" item="productId" separator=";">
      insert into node_product (node_id, product_id)
      values (#{nodeId}, #{productId})
    </foreach>
  </insert>
    <insert id="insertModelNode"
            parameterType="com.dingzhuo.energy.data.model.domain.ModelNode">
        insert into model_node
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="nodeId != null  and nodeId != ''">node_id,</if>
            <if test="code != null  and code != ''">code,</if>
            <if test="name != null  and name != ''">name,</if>
            <if test="parentId != null  and parentId != ''">parent_id,</if>
            <if test="address != null  and address != ''">address,</if>
            <if test="modelCode != null  and modelCode != ''">model_code,</if>
            <if test="nodeCategory != null  and nodeCategory != ''">node_category,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="nodeId != null  and nodeId != ''">#{nodeId},</if>
            <if test="code != null  and code != ''">#{code},</if>
            <if test="name != null  and name != ''">#{name},</if>
            <if test="parentId != null  and parentId != ''">#{parentId},</if>
            <if test="address != null  and address != ''">#{address},</if>
            <if test="modelCode != null  and modelCode != ''">#{modelCode},</if>
            <if test="nodeCategory != null  and nodeCategory != ''">#{nodeCategory},</if>
        </trim>
    </insert>
    <insert id="setDevice">
        delete
        from node_device
        where node_id = #{nodeId};
        <foreach collection="deviceIds" item="deviceId" separator=";">
            insert into node_device (node_id, device_id)
            values (#{nodeId}, #{deviceId})
        </foreach>
    </insert>
    <insert id="setEnergy">
        delete
        from node_energy
        where node_id = #{nodeId};
        <foreach collection="energyIds" item="energyId" separator=";">
            insert into node_energy (node_id, energy_id)
            values (#{nodeId}, #{energyId})
        </foreach>
    </insert>
    <insert id="setProduct">
        delete
        from node_product
        where node_id = #{nodeId};
        <foreach collection="productIds" item="productId" separator=";">
            insert into node_product (node_id, product_id)
            values (#{nodeId}, #{productId})
        </foreach>
    </insert>
  <update id="updateModelNode"
    parameterType="com.dingzhuo.energy.data.model.domain.ModelNode">
    update model_node
    <trim prefix="SET" suffixOverrides=",">
      <if test="code != null  and code != ''">code = #{code},</if>
      <if test="name != null  and name != ''">name = #{name},</if>
      <if test="parentId != null  and parentId != ''">parent_id = #{parentId},</if>
      <if test="address != null  and address != ''">address = #{address},</if>
      <if test="modelCode != null  and modelCode != ''">model_code = #{modelCode},</if>
      <if test="nodeCategory != null and nodeCategory != ''">node_category = #{nodeCategory},</if>
    </trim>
    where node_id = #{nodeId}
  </update>
  <update id="updateModelNodeParent">
    update model_node
    set parent_id = #{parentId}
    where node_id = #{nodeId};
    <update id="updateModelNode"
            parameterType="com.dingzhuo.energy.data.model.domain.ModelNode">
        update model_node
        <trim prefix="SET" suffixOverrides=",">
            <if test="code != null  and code != ''">code = #{code},</if>
            <if test="name != null  and name != ''">name = #{name},</if>
            <if test="parentId != null  and parentId != ''">parent_id = #{parentId},</if>
            <if test="address != null  and address != ''">address = #{address},</if>
            <if test="modelCode != null  and modelCode != ''">model_code = #{modelCode},</if>
            <if test="nodeCategory != null and nodeCategory != ''">node_category = #{nodeCategory},</if>
        </trim>
        where node_id = #{nodeId}
    </update>
    <update id="updateModelNodeParent">
        update model_node
        set parent_id = #{parentId}
        where node_id = #{nodeId};
    update model_node
    set address = replace(address, (select address from model_node where node_id = #{nodeId}),
                          (select address ||
                                  (select code from model_node where node_id = #{nodeId}) ||
                                  ','
                           from model_node
                           where node_id = #{parentId}))
    where parent_id = #{nodeId}
       or node_id = #{nodeId};
  </update>
  <update id="updateModelNodeOrder">
    <foreach collection="orders" index="id" item="order" separator=";">
      update model_node
      set order_num = #{order}
      where node_id = #{id}
    </foreach>
  </update>
  <update id="setIndex">
    delete
    from node_index
    where node_id = #{nodeId} and index_id in (select ni.index_id
    from node_index ni left join energy_index ei on ni.index_id = ei.index_id
    where node_id = #{nodeId} and ei.index_type = #{indexType});
    <foreach collection="indexIds" item="indexId" separator=";">
      insert into node_index (node_id, index_id)
      values (#{nodeId}, #{indexId})
    </foreach>
  </update>
        update model_node
        set address = replace(address, (select address from model_node where node_id = #{nodeId}),
                              (select address ||
                                      (select code from model_node where node_id = #{nodeId}) ||
                                      ','
                               from model_node
                               where node_id = #{parentId}))
        where parent_id = #{nodeId}
           or node_id = #{nodeId};
    </update>
    <update id="updateModelNodeOrder">
        <foreach collection="orders" index="id" item="order" separator=";">
            update model_node
            set order_num = #{order}
            where node_id = #{id}
        </foreach>
    </update>
    <update id="setIndex">
        delete
        from node_index
        where node_id = #{nodeId} and index_id in (select ni.index_id
        from node_index ni left join energy_index ei on ni.index_id = ei.index_id
        where node_id = #{nodeId} and ei.index_type = #{indexType});
        <foreach collection="indexIds" item="indexId" separator=";">
            insert into node_index (node_id, index_id)
            values (#{nodeId}, #{indexId})
        </foreach>
    </update>
  <delete id="deleteModelNodeById" parameterType="String">
    delete
    from model_node
    where node_id = #{nodeId}
  </delete>
    <delete id="deleteModelNodeById" parameterType="String">
        delete
        from model_node
        where node_id = #{nodeId}
    </delete>
  <delete id="deleteModelNodeByIds" parameterType="String">
    delete from model_node where node_id in
    <foreach item="nodeId" collection="array" open="(" separator="," close=")">
      #{nodeId}
    </foreach>
  </delete>
  <delete id="delDevice">
    delete
    from node_device
    where node_id = #{nodeId} and device_id in
    <foreach item="deviceId" collection="deviceIds" open="(" separator="," close=")">
      #{deviceId}
    </foreach>
  </delete>
  <delete id="delEnergy">
    delete
    from node_energy
    where node_id = #{nodeId} and energy_id in
    <foreach item="energyId" collection="energyIds" open="(" separator="," close=")">
      #{energyId}
    </foreach>
  </delete>
  <delete id="delProduct">
    delete
    from node_product
    where node_id = #{nodeId} and product_id in
    <foreach item="productId" collection="productIds" open="(" separator="," close=")">
      #{productId}
    </foreach>
  </delete>
  <delete id="delIndex">
    delete
    from node_index
    where node_id = #{nodeId} and index_id in
    <foreach item="indexId" collection="indexIds" open="(" separator="," close=")">
      #{indexId}
    </foreach>
  </delete>
    <delete id="deleteModelNodeByIds" parameterType="String">
        delete from model_node where node_id in
        <foreach item="nodeId" collection="array" open="(" separator="," close=")">
            #{nodeId}
        </foreach>
    </delete>
    <delete id="delDevice">
        delete
        from node_device
        where node_id = #{nodeId} and device_id in
        <foreach item="deviceId" collection="deviceIds" open="(" separator="," close=")">
            #{deviceId}
        </foreach>
    </delete>
    <delete id="delEnergy">
        delete
        from node_energy
        where node_id = #{nodeId} and energy_id in
        <foreach item="energyId" collection="energyIds" open="(" separator="," close=")">
            #{energyId}
        </foreach>
    </delete>
    <delete id="delProduct">
        delete
        from node_product
        where node_id = #{nodeId} and product_id in
        <foreach item="productId" collection="productIds" open="(" separator="," close=")">
            #{productId}
        </foreach>
    </delete>
    <delete id="delIndex">
        delete
        from node_index
        where node_id = #{nodeId} and index_id in
        <foreach item="indexId" collection="indexIds" open="(" separator="," close=")">
            #{indexId}
        </foreach>
    </delete>
  <select id="getSettingIndexByWhere"
          resultType="com.dingzhuo.energy.data.model.domain.EnergyIndex">
    select ei.index_id as indexId, code, name, index_type as indexType
    from energy_index ei
           left join node_index ni on ei.index_id = ni.index_id
    where ni.node_id = #{nodeId}
    <if test="indexName!=null and indexName!=''">
      and ei.name like concat('%', #{indexName}, '%')
    </if>
  </select>
    <select id="getSettingIndexByWhere"
            resultType="com.dingzhuo.energy.data.model.domain.EnergyIndex">
        select ei.index_id as indexId, code, name, index_type as indexType
        from energy_index ei
        left join node_index ni on ei.index_id = ni.index_id
        where ni.node_id = #{nodeId}
        <if test="indexName!=null and indexName!=''">
            and ei.name like concat('%', #{indexName}, '%')
        </if>
    </select>
  <select id="listIndesxByCodeList" resultType="java.lang.String">
    SELECT
      index_id
    FROM
      "node_index"
    WHERE
      node_id IN
    <foreach item="nodeId" collection="nodeIds" open="(" separator="," close=")">
      #{nodeId}
    </foreach>
  </select>
    <select id="listIndesxByCodeList" resultType="java.lang.String">
        SELECT
        index_id
        FROM
        "node_index"
        WHERE
        node_id IN
        <foreach item="nodeId" collection="nodeIds" open="(" separator="," close=")">
            #{nodeId}
        </foreach>
    </select>
  <select id="getModelNodeIndexIdRelationInforByCode"
          resultType="com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor">
    SELECT
      mn.node_id nodeId,
      mn."name" name,
      ni.index_id indexId
    FROM
      "model_node" mn
      LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
    WHERE
      mn.model_code = #{code}
      AND   mn.parent_id IS NOT NULL
  </select>
    <select id="getModelNodeIndexIdRelationInforByCode"
            resultType="com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor">
        SELECT mn.node_id  nodeId,
               mn."name"   name,
               ni.index_id indexId
        FROM "model_node" mn
                 LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
        WHERE mn.model_code = #{code}
          AND mn.parent_id IS NOT NULL
    </select>
  <select id="listModelNodeIndexIdRelationInforByParentId" resultType="com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor">
    SELECT
      mn.node_id nodeId,
      mn."name" name,
      ni.index_id indexId
    FROM
      "model_node" mn
      LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
    WHERE
      mn.parent_id = #{parentId}
  </select>
    <select id="listModelNodeIndexIdRelationInforByParentId"
            resultType="com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor">
        SELECT mn.node_id  nodeId,
               mn."name"   name,
               ni.index_id indexId
        FROM "model_node" mn
                 LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
        WHERE mn.parent_id = #{parentId}
    </select>
  <select id="getModelNodeIndexIdRelationInforByNodeId"
          resultType="com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor">
    SELECT
      mn.node_id nodeId,
      mn."name" name,
      ni.index_id indexId
    FROM
      "model_node" mn
      LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
    WHERE
      mn.node_id = #{nodeId}
  </select>
    <select id="getModelNodeIndexIdRelationInforByNodeId"
            resultType="com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor">
        SELECT mn.node_id  nodeId,
               mn."name"   name,
               ni.index_id indexId
        FROM "model_node" mn
                 LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
        WHERE mn.node_id = #{nodeId}
    </select>
  <select id="getModelNodeByModelCodeByIndexCode" resultType="com.dingzhuo.energy.data.model.domain.ModelNode">
    SELECT
      node_id nodeId,
      code,
      "name",
      parent_id parentId,
      address,
      model_code modelCode,
      node_category nodeCategory
    FROM
      "model_node"
    WHERE
      model_code = #{indexCode}
      AND parent_id IS NULL
      LIMIT 1;
  </select>
    <select id="getModelNodeByModelCodeByIndexCode" resultType="com.dingzhuo.energy.data.model.domain.ModelNode">
        SELECT node_id       nodeId,
               code,
               "name",
               parent_id     parentId,
               address,
               model_code    modelCode,
               node_category nodeCategory
        FROM "model_node"
        WHERE model_code = #{indexCode}
          AND parent_id IS NULL LIMIT 1;
    </select>
    <select id="selectIndexByModelCodeAndNodeId"
            resultType="com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor">
        SELECT mn.node_id nodeId,
               mn."name",
               ni.index_id indexId
        FROM model_node mn
                 LEFT JOIN node_index ni ON ni.node_id = mn.node_id
        WHERE mn.model_code = #{modelCode}
          AND mn.node_id = #{nodeId}
    </select>
</mapper>
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/controller/ElectricityDataItemController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.dingzhuo.energy.project.electricityTypeSetting.controller;
import com.dingzhuo.energy.framework.web.controller.BaseController;
import com.dingzhuo.energy.framework.web.domain.AjaxResult;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.dto.ElectricityDataItemListDTO;
import com.dingzhuo.energy.project.electricityTypeSetting.service.IElectricityDataItemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 * å°–峰平谷数据Controller
 *
 * @author ruoyi
 * @date 2024-06-19
 */
@RestController
@RequestMapping("/electricityDataItem")
@Api(tags = "尖峰平谷数据")
public class ElectricityDataItemController extends BaseController {
    @Resource
    private IElectricityDataItemService rulesService;
    /**
     * èŽ·å–å°–å³°å¹³è°·æ•°æ®ç»Ÿè®¡
     */
    @GetMapping("/getDataStatistics")
    @ApiOperation(value = "获取尖峰平谷数据统计")
    public AjaxResult getDataStatistics(ElectricityDataItemListDTO dto) {
        return AjaxResult.success(rulesService.getDataStatistics(dto));
    }
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/controller/ElectricityTypeSettingController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
package com.dingzhuo.energy.project.electricityTypeSetting.controller;
import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
import com.dingzhuo.energy.framework.web.controller.BaseController;
import com.dingzhuo.energy.framework.web.domain.AjaxResult;
import com.dingzhuo.energy.framework.web.page.TableDataInfo;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.dto.ElectricityTypeSettingAddVO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.dto.ElectricityTypeSettingUpdateVO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.vo.ElectricityTypeSettingItemQueryVO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.vo.ElectricityTypeSettingPageListVO;
import com.dingzhuo.energy.project.electricityTypeSetting.service.IElectricityTypeSettingService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
 * è®¡è´¹ç­–ç•¥Controller
 *
 * @author ruoyi
 * @date 2024-06-19
 */
@RestController
@RequestMapping("/rule")
@Api(tags = "计费策略")
public class ElectricityTypeSettingController extends BaseController {
    @Resource
    private IElectricityTypeSettingService rulesService;
    /**
     * æŸ¥è¯¢è®¡è´¹è§„则列表
     */
    @GetMapping("/list")
    @ApiOperation(value = "分页查询计费规则列表")
    public TableDataInfo list(@ApiParam("计费规则名称") @RequestParam(value = "name", required = false) String name) {
        startPage();
        List<ElectricityTypeSettingPageListVO> responsePage = rulesService.selectPageList(name);
        return getDataTable(responsePage);
    }
    /**
     * èŽ·å–è®¡è´¹è§„åˆ™è¯¦æƒ…
     */
    @GetMapping(value = "/getRuleDetail")
    @ApiOperation(value = "获取计费规则详情")
    public AjaxResult getRuleDetail(@ApiParam("计费规则id") @NotNull(message = "id不能为空!") @RequestParam("id") String id) {
        ElectricityTypeSettingItemQueryVO response = rulesService.getRuleDetail(id);
        return AjaxResult.success(response);
    }
    /**
     * æ–°å¢žè®¡è´¹ç­–ç•¥
     */
    @PostMapping("/addRule")
    @ApiOperation(value = "新增计费策略")
    @Log(title = "新增计费策略", businessType = BusinessType.INSERT)
    public AjaxResult addRule(@RequestBody @Validated ElectricityTypeSettingAddVO request) {
        rulesService.addRule(request);
        return AjaxResult.success();
    }
    /**
     * ä¿®æ”¹è®¡è´¹ç­–ç•¥
     */
    @PostMapping("/updateRule")
    @ApiOperation(value = "修改计费策略")
    @Log(title = "修改计费策略", businessType = BusinessType.UPDATE)
    public AjaxResult updateRule(@RequestBody @Validated ElectricityTypeSettingUpdateVO request) {
        rulesService.updateRule(request);
        return AjaxResult.success();
    }
    /**
     * åˆ é™¤è®¡è´¹ç­–ç•¥
     */
    @DeleteMapping("/delRule/{id}")
    @ApiOperation(value = "删除计费策略")
    @Log(title = "删除计费策略", businessType = BusinessType.DELETE)
    public AjaxResult delRule(@ApiParam("计费规则id") @NotNull(message = "id不能为空!") @PathVariable("id") String id) {
        rulesService.delRule(id);
        return AjaxResult.success();
    }
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/dto/ElectricityDataItemListDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.dto;
import com.dingzhuo.energy.common.utils.time.TimeType;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
 * å°–峰平谷数据列表实体类 electricityDataItem
 *
 * @author ruoyi
 * @date 2024-06-19
 */
@Data
@ApiModel(value = "尖峰平谷数据列表实体类")
public class ElectricityDataItemListDTO {
    /**
     * æ¨¡åž‹ç¼–号
     */
    @ApiModelProperty(value = "模型编号")
    @NotBlank(message = "模型编号不能为空!")
    private String modelCode;
    /**
     * èŠ‚ç‚¹id
     */
    @ApiModelProperty(value = "节点id")
    @NotBlank(message = "节点id不能为空!")
    private String nodeId;
    /**
     * æ—¶é—´ç±»åž‹
     */
    @ApiModelProperty(value = "时间类型")
    @NotBlank(message = "时间类型不能为空!")
    private String timeType;
    /**
     * æŸ¥è¯¢æ—¶é—´
     */
    @ApiModelProperty(value = "查询时间")
    @NotNull(message = "查询时间不能为空!")
    @DateTimeFormat(pattern = "yyyy-MM")
    private Date queryTime;
    public String getTimeType() {
        switch (TimeType.valueOf(this.timeType)) {
            case HOUR:
            case DAY:
                return TimeType.HOUR.name();
            case MONTH:
                return TimeType.DAY.name();
            case YEAR:
                return TimeType.MONTH.name();
            default:
                return TimeType.DAY.name();
        }
    }
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/dto/ElectricityTypeSettingAddVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
 * è®¡è´¹è§„则对象 rules
 *
 * @author ruoyi
 * @date 2024-06-19
 */
@Data
@ApiModel(value = "计费规则新增请求实体类")
public class ElectricityTypeSettingAddVO {
    /**
     * è§„则名称
     */
    @ApiModelProperty(value = "规则名称")
    @NotBlank(message = "规则名称不能为空!")
    private String name;
    /**
     * ç”Ÿæ•ˆæ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "生效时间")
    @NotNull(message = "生效时间不能为空!")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date effectiveDate;
    /**
     * å°–时段电费价格
     */
    @ApiModelProperty(value = "尖时段电费价格")
    @NotNull(message = "尖时段电费价格不能为空!")
    @DecimalMin(value = "0", message = "尖时段电费价格最小为0")
    private BigDecimal sharpFee;
    /**
     * å³°æ—¶æ®µç”µè´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "峰时段电费价格")
    @NotNull(message = "峰时段电费价格不能为空!")
    @DecimalMin(value = "0", message = "峰时段电费价格最小为0")
    private BigDecimal peakFee;
    /**
     * å¹³æ—¶æ®µç”µè´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "平时段电费价格")
    @NotNull(message = "平时段电费价格不能为空!")
    @DecimalMin(value = "0", message = "平时段电费价格最小为0")
    private BigDecimal flatFee;
    /**
     * è°·æ—¶æ®µç”µè´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "谷时段电费价格")
    @NotNull(message = "谷时段电费价格不能为空!")
    @DecimalMin(value = "0", message = "谷时段电费价格最小为0")
    private BigDecimal valleyFee;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * è®¡è´¹ç­–略详情列表
     */
    @ApiModelProperty(value = "计费策略详情列表")
    @NotNull(message = "尖峰平谷时间段不能为空!")
    private List<ElectricityTypeSettingItemAddVO> ruleDetailList;
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/dto/ElectricityTypeSettingItemAddVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**
 * ä»·æ ¼å¯¹è±¡ rule_details
 *
 * @author ruoyi
 * @date 2024-06-14
 */
@Data
@ApiModel(value = "计费规则费用类型及时间段新增请求类")
public class ElectricityTypeSettingItemAddVO {
    /**
     * è´¹ç”¨ç±»åž‹æ—¶é—´æ®µ
     */
    @ApiModelProperty(value = "费用类型时间段")
    @NotNull(message = "费用类型时间段不能为空!")
    @Min(value = 1, message = "费用类型时间段最小值为1")
    @Max(value = 48, message = "费用类型时间段最大值为48")
    private Integer timePeriod;
    /**
     * æ—¶é—´æ®µç±»åž‹ 0:尖 1:å³° 2:å¹³ 3:è°· 4:深谷
     */
    @ApiModelProperty(value = "时间段类型")
    @NotNull(message = "时间段类型不能为空!")
    private String type;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    private String remark;
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/dto/ElectricityTypeSettingItemUpdateVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
 * ä»·æ ¼å¯¹è±¡ rule_details
 *
 * @author ruoyi
 * @date 2024-06-14
 */
@Data
@ApiModel(value = "计费规则费用类型及时间段更新请求类")
public class ElectricityTypeSettingItemUpdateVO {
    /**
     * è®¡è´¹è§„则子表id
     */
    @ApiModelProperty(value = "计费规则子表id")
    @NotNull(message = "计费规则子表id不能为空!")
    private String id;
    /**
     * ç”µè´¹ç±»åž‹ 0:尖 1:å³° 2:å¹³ 3:è°· 4:深谷
     */
    @ApiModelProperty(value = "费用类型")
    @NotNull(message = "费用类型不能为空!")
    private String type;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    private String remark;
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/dto/ElectricityTypeSettingUpdateVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
 * è®¡è´¹è§„则对象 rules
 *
 * @author ruoyi
 * @date 2024-06-19
 */
@Data
@ApiModel(value = "计费规则更新请求实体类")
public class ElectricityTypeSettingUpdateVO {
    /**
     * ä¸»é”®
     */
    @NotNull(message = "id不能为空!")
    @ApiModelProperty(value = "计费规则id")
    private String id;
    /**
     * è§„则名称
     */
    @NotBlank(message = "规则名称不能为空!")
    @ApiModelProperty(value = "规则名称")
    private String name;
    /**
     * ç”Ÿæ•ˆæ—¶é—´
     */
    @ApiModelProperty(value = "生效时间")
    @NotBlank(message = "生效时间不能为空!")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date effectiveDate;
    /**
     * å°–时段电费价格
     */
    @ApiModelProperty(value = "尖时段电费价格")
    @NotNull(message = "尖时段电费价格不能为空!")
    @DecimalMin(value = "0", message = "尖时段电费价格最小为0")
    private BigDecimal sharpFee;
    /**
     * å³°æ—¶æ®µç”µè´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "峰时段电费价格")
    @NotNull(message = "峰时段电费价格不能为空!")
    @DecimalMin(value = "0", message = "峰时段电费价格最小为0")
    private BigDecimal peakFee;
    /**
     * å¹³æ—¶æ®µç”µè´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "平时段电费价格")
    @NotNull(message = "平时段电费价格不能为空!")
    @DecimalMin(value = "0", message = "平时段电费价格最小为0")
    private BigDecimal flatFee;
    /**
     * è°·æ—¶æ®µç”µè´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "谷时段电费价格")
    @NotNull(message = "谷时段电费价格不能为空!")
    @DecimalMin(value = "0", message = "谷时段电费价格最小为0")
    private BigDecimal valleyFee;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * è®¡è´¹ç­–略详情列表
     */
    @ApiModelProperty(value = "计费策略详情列表")
    @NotNull(message = "尖峰平谷时间段不能为空!")
    private List<ElectricityTypeSettingItemUpdateVO> ruleDetailList;
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/entity/ElectricityDataItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.entity;
import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * å°–峰平谷数据表
 *
 * @author sys
 * @date 2024-08-27
 */
@Data
public class ElectricityDataItem {
    private static final long serialVersionUID = 1L;
    /**
     * ç‚¹ä½id
     */
    @Excel(name = "点位id")
    private String indexId;
    /**
     * æ—¶é—´ç¼–号
     */
    @Excel(name = "时间编号")
    private String timeCode;
    /**
     * æ—¶é—´ç±»åž‹
     */
    @Excel(name = "时间类型")
    private String timeType;
    /**
     * ç”¨ç”µç±»åž‹å³°ã€å¹³ã€è°·ç­‰
     */
    @Excel(name = "用电类型峰、平、谷等")
    private String electricityType;
    /**
     * æŒ‡æ ‡ç¼–码,冗余字段,可以用 code æŸ¥è¯¢
     */
    @Excel(name = "指标编码,冗余字段,可以用 code æŸ¥è¯¢")
    private String indexCode;
    /**
     * æ•°æ®æ—¶é—´
     */
    @Excel(name = "数据时间", width = 30, dateFormat = "yyyy-MM-dd")
    private Date dataTime;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd")
    private Date beginTime;
    /**
     * ç»“束时间
     */
    @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd")
    private Date endTime;
    /**
     * ç”¨ç”µé‡
     */
    @Excel(name = "用电量")
    private BigDecimal electricity;
    /**
     * ç”µè´¹
     */
    @Excel(name = "电费")
    private BigDecimal cost;
    /**
     * å•ä»·
     */
    @Excel(name = "单价")
    private BigDecimal price;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @ApiModelProperty(value = "更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    private String remark;
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/entity/ElectricityTypeSetting.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.entity;
import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
import com.dingzhuo.energy.framework.web.domain.BaseEntity;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * è®¡è´¹è§„则对象 rules
 *
 * @author ruoyi
 * @date 2024-06-14
 */
@Data
public class ElectricityTypeSetting extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * $column.columnComment
     */
    private String id;
    /**
     * è§„则名称
     */
    @Excel(name = "规则名称")
    private String name;
    /**
     * ç”Ÿæ•ˆæ—¶é—´
     */
    @Excel(name = "生效时间")
    private Date effectiveDate;
    /**
     * å°–电费价格
     */
    @Excel(name = "尖电费价格")
    private BigDecimal sharpFee;
    /**
     * å³°ç”µè´¹ä»·æ ¼
     */
    @Excel(name = "峰电费价格")
    private BigDecimal peakFee;
    /**
     * å¹³ç”µè´¹ä»·æ ¼
     */
    @Excel(name = "平电费价格")
    private BigDecimal flatFee;
    /**
     * è°·ç”µè´¹ä»·æ ¼
     */
    @Excel(name = "谷电费价格")
    private BigDecimal valleyFee;
    /**
     * ç»„织架构id
     */
    @Excel(name = "组织架构id")
    private Long deptId;
    /**
     * '0'删除标志(0代表存在 2代表删除)
     */
    private String delFlag;
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/entity/ElectricityTypeSettingItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.entity;
import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
import com.dingzhuo.energy.framework.web.domain.BaseEntity;
import lombok.Data;
/**
 * ä»·æ ¼å¯¹è±¡ rule_details
 *
 * @author ruoyi
 * @date 2024-06-14
 */
@Data
public class ElectricityTypeSettingItem extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * $column.columnComment
     */
    private String id;
    /**
     * è®¡è´¹è§„则id
     */
    @Excel(name = "计费规则id")
    private String ruleId;
    /**
     * è´¹ç”¨ç±»åž‹æ—¶é—´æ®µ
     */
    @Excel(name = "费用类型时间段", readConverterExp = "1=0:00")
    private Integer timePeriod;
    /**
     * ç”µè´¹ç±»åž‹ 0:尖 1:å³° 2:å¹³ 3:è°· 4:深谷
     */
    @Excel(name = "电费类型 0:尖 1:å³° 2:å¹³ 3:è°· 4:深谷")
    private String type;
    /**
     * ç»„织架构id
     */
    @Excel(name = "组织架构id")
    private Long deptId;
    /**
     * åˆ é™¤æ ‡è®°ï¼Œé»˜è®¤0:未删除,2 åˆ é™¤
     */
    private String delFlag;
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/enums/ElectricityTypeEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ElectricityTypeEnum {
    SHARP("尖"),
    PEAK("å³°"),
    FLAT("å¹³"),
    VALLEY("è°·");
    private final String desc;
    public static String getNameByType(String type) {
        for (ElectricityTypeEnum electricityType : ElectricityTypeEnum.values()) {
            if (electricityType.name().equalsIgnoreCase(type)) {
                return electricityType.name();
            }
        }
        throw new IllegalArgumentException("Invalid electricity type: " + type);
    }
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/vo/ElectricityPeriodFeeDetailVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "计费规则各时段的费用返回实体")
public class ElectricityPeriodFeeDetailVO {
    /**
     * è´¹ç”¨ç±»åž‹æ—¶é—´æ®µ
     */
    @ApiModelProperty(value = "费用类型时间段")
    private Integer timePeriod;
    /**
     * ç”µè´¹ç±»åž‹ 0:尖 1:å³° 2:å¹³ 3:è°· 4:深谷
     */
    @ApiModelProperty(value = "费用类型 0:尖 1:å³° 2:å¹³ 3:è°· 4:深谷")
    private Integer type;
    /**
     * ç”µè´¹ç±»åž‹ 0:尖 1:å³° 2:å¹³ 3:è°· 4:深谷
     */
    @ApiModelProperty(value = "费用类型描述")
    private String typeDesc;
    /**
     * ç”µè´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "电费价格")
    private BigDecimal electricityFee;
    /**
     * æœåŠ¡è´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "服务费价格")
    private BigDecimal serviceFee;
    /**
     * åœè½¦è´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "停车费价格")
    private BigDecimal parkingFee;
    /**
     * è¶…时占用费价格
     */
    @ApiModelProperty(value = "超时占用费价格")
    private BigDecimal occupancyFee;
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/vo/ElectricityTypeSettingItemQueryVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,151 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
 * è®¡è´¹è§„则对象 rules
 *
 * @author ruoyi
 * @date 2024-06-19
 */
@Data
@ApiModel(value = "计费规则详情查询返回实体类")
public class ElectricityTypeSettingItemQueryVO {
    /**
     * ä¸»é”®
     */
    @ApiModelProperty(value = "计费规则id")
    @JsonSerialize(using = ToStringSerializer.class)
    private String id;
    /**
     * è§„则名称
     */
    @ApiModelProperty(value = "规则名称")
    private String name;
    /**
     * ç”Ÿæ•ˆæ—¶é—´
     */
    @ApiModelProperty(value = "生效时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date effectiveDate;
    /**
     * å°–时段电费价格
     */
    @ApiModelProperty(value = "尖时段电费价格")
    private BigDecimal sharpFee;
    /**
     * å³°æ—¶æ®µç”µè´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "峰时段电费价格")
    private BigDecimal peakFee;
    /**
     * å¹³æ—¶æ®µç”µè´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "平时段电费价格")
    private BigDecimal flatFee;
    /**
     * è°·æ—¶æ®µç”µè´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "谷时段电费价格")
    private BigDecimal valleyFee;
    /**
     * å°–时段服务费价格
     */
    @ApiModelProperty(value = "尖时段服务费价格")
    private BigDecimal sharpServiceFee;
    /**
     * å³°æ—¶æ®µæœåŠ¡è´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "峰时段服务费价格")
    private BigDecimal peakServiceFee;
    /**
     * å¹³æ—¶æ®µæœåŠ¡è´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "平时段服务费价格")
    private BigDecimal flatServiceFee;
    /**
     * è°·æ—¶æ®µæœåŠ¡è´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "谷时段服务费价格")
    private BigDecimal valleyServiceFee;
    /**
     * å°–时段停车费价格
     */
    @ApiModelProperty(value = "尖时段停车费价格")
    private BigDecimal sharpParkingFee;
    /**
     * å³°æ—¶æ®µåœè½¦è´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "峰时段停车费价格")
    private BigDecimal peakParkingFee;
    /**
     * å¹³æ—¶æ®µåœè½¦è´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "平时段停车费价格")
    private BigDecimal flatParkingFee;
    /**
     * è°·æ—¶æ®µåœè½¦è´¹ä»·æ ¼
     */
    @ApiModelProperty(value = "谷时段停车费价格")
    private BigDecimal valleyParkingFee;
    /**
     * å°–时段超时占用费价格
     */
    @ApiModelProperty(value = "尖时段超时占用费价格")
    private BigDecimal sharpOccupancyFee;
    /**
     * å³°æ—¶æ®µè¶…时占用费价格
     */
    @ApiModelProperty(value = "峰时段超时占用费价格")
    private BigDecimal peakOccupancyFee;
    /**
     * å¹³æ—¶æ®µè¶…时占用费价格
     */
    @ApiModelProperty(value = "平时段超时占用费价格")
    private BigDecimal flatOccupancyFee;
    /**
     * è°·æ—¶æ®µè¶…时占用费价格
     */
    @ApiModelProperty(value = "谷时段超时占用费价格")
    private BigDecimal valleyOccupancyFee;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * è®¡è´¹ç­–略详情列表
     */
    @ApiModelProperty(value = "计费策略时间段详情列表")
    private List<ElectricityTypeSettingItemVO> ruleDetailList;
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/vo/ElectricityTypeSettingItemVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * ä»·æ ¼å¯¹è±¡ rule_details
 *
 * @author ruoyi
 * @date 2024-06-14
 */
@Data
@ApiModel(value = "计费规则详情查询返回时间段实体类")
public class ElectricityTypeSettingItemVO {
    /**
     * ä¸»é”®
     */
    @ApiModelProperty(value = "计费规则子表id")
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;
    /**
     * è®¡è´¹è§„则id
     */
    @ApiModelProperty(value = "计费规则id")
    @JsonSerialize(using = ToStringSerializer.class)
    private Long ruleId;
    /**
     * è´¹ç”¨ç±»åž‹æ—¶é—´æ®µ
     */
    @ApiModelProperty(value = "费用类型时间段")
    private Integer timePeriod;
    /**
     * ç”µè´¹ç±»åž‹ 0:尖 1:å³° 2:å¹³ 3:è°· 4:深谷
     */
    @ApiModelProperty(value = "费用类型 0:尖 1:å³° 2:å¹³ 3:è°· 4:深谷")
    private String type;
    /**
     * ç”µè´¹ç±»åž‹ 0:尖 1:å³° 2:å¹³ 3:è°· 4:深谷
     */
    @ApiModelProperty(value = "费用类型描述")
    private String typeDesc;
    /**
     * ç»„织架构id
     */
    @ApiModelProperty(value = "组织架构id")
    @JsonSerialize(using = ToStringSerializer.class)
    private Long deptId;
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/vo/ElectricityTypeSettingPageListVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * è®¡è´¹è§„则对象 rules
 *
 * @author ruoyi
 * @date 2024-06-19
 */
@Data
@ApiModel(value = "计费规则分页查询返回实体类")
public class ElectricityTypeSettingPageListVO {
    /**
     * ä¸»é”®
     */
    @ApiModelProperty(value = "计费规则id")
    @JsonSerialize(using = ToStringSerializer.class)
    private String id;
    /**
     * è§„则名称
     */
    @ApiModelProperty(value = "规则名称")
    private String name;
    /**
     * æ˜¯å¦ç”Ÿæ•ˆ
     */
    @ApiModelProperty(value = "是否生效")
    private boolean isEffective;
    /**
     * ç”Ÿæ•ˆæ—¶é—´
     */
    @ApiModelProperty(value = "生效时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date effectiveDate;
    /**
     * åˆ›å»ºè€…
     */
    @ApiModelProperty(value = "创建者")
    private String createBy;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    private String remark;
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/domain/vo/PeakAndValleyReportVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.dingzhuo.energy.project.electricityTypeSetting.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.Date;
/**
 * å°–峰平谷报表 vo
 */
@Data
@NoArgsConstructor
@ApiModel(value = "尖峰平谷报表 vo", description = "尖峰平谷报表 vo")
public class PeakAndValleyReportVO {
    /**
     * æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "时间")
    private Date time;
    /**
     * å°–费用
     */
    @ApiModelProperty(value = "尖费用")
    private BigDecimal sharpFee;
    /**
     * å°–电量
     */
    @ApiModelProperty(value = "尖电量")
    private BigDecimal sharpPower;
    /**
     * å³°è´¹ç”¨
     */
    @ApiModelProperty(value = "峰费用")
    private BigDecimal peakFee;
    /**
     * å³°ç”µé‡
     */
    @ApiModelProperty(value = "峰电量")
    private BigDecimal peakPower;
    /**
     * å¹³è´¹ç”¨
     */
    @ApiModelProperty(value = "平费用")
    private BigDecimal flatFee;
    /**
     * å¹³ç”µé‡
     */
    @ApiModelProperty(value = "平电量")
    private BigDecimal flatPower;
    /**
     * è°·è´¹ç”¨
     */
    @ApiModelProperty(value = "谷费用")
    private BigDecimal valleyFee;
    /**
     * è°·ç”µé‡
     */
    @ApiModelProperty(value = "谷电量")
    private BigDecimal valleyPower;
    public PeakAndValleyReportVO(Date time, BigDecimal sharpFee, BigDecimal sharpPower, BigDecimal peakFee,
                                 BigDecimal peakPower, BigDecimal flatFee, BigDecimal flatPower, BigDecimal valleyFee,
                                 BigDecimal valleyPower) {
        this.time = time;
        this.sharpFee = sharpFee;
        this.sharpPower = sharpPower;
        this.peakFee = peakFee;
        this.peakPower = peakPower;
        this.flatFee = flatFee;
        this.flatPower = flatPower;
        this.valleyFee = valleyFee;
        this.valleyPower = valleyPower;
    }
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/mapper/ElectricityDataItemMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.dingzhuo.energy.project.electricityTypeSetting.mapper;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.entity.ElectricityDataItem;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
 * å°–峰平谷数据对象 Mapper接口
 *
 * @author sys
 * @date 2024-08-27
 */
public interface ElectricityDataItemMapper {
    /**
     * æŸ¥è¯¢å°–峰平谷统计数据
     *
     * @param indexIdSet ç‚¹ä½id集合
     * @param startTime  å¼€å§‹æ—¶é—´
     * @param endTime    æˆªæ­¢æ—¶é—´
     * @param timeType   æ—¶é—´ç±»åž‹
     * @return ç»“æžœ
     */
    List<ElectricityDataItem> getDataStatistics(@Param("indexIdSet") Set<String> indexIdSet, @Param("startTime") Date startTime,
                                                @Param("endTime") Date endTime, @Param("timeType") String timeType);
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/mapper/ElectricityTypeSettingItemMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package com.dingzhuo.energy.project.electricityTypeSetting.mapper;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.entity.ElectricityTypeSettingItem;
import java.util.List;
/**
 * ä»·æ ¼Mapper接口
 *
 * @author ruoyi
 * @date 2024-06-14
 */
public interface ElectricityTypeSettingItemMapper {
    /**
     * æ ¹æ®è§„则id查询规则详情
     *
     * @param id è§„则id
     * @return ç»“æžœ
     */
    List<ElectricityTypeSettingItem> selectListByRuleId(String id);
    /**
     * ä¿®æ”¹
     *
     * @param ruleDetails è§„则详情
     */
    int updateRuleDetails(ElectricityTypeSettingItem ruleDetails);
    /**
     * æ–°å¢žè§„则明细
     *
     * @param ruleDetails è§„则明细
     * @return ç»“æžœ
     */
    int insertRuleDetails(ElectricityTypeSettingItem ruleDetails);
    /**
     * æ ¹æ®è§„则id删除规则明细
     *
     * @param ruleId è§„则id
     */
    int deleteRulesByRuleId(String ruleId);
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/mapper/ElectricityTypeSettingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.dingzhuo.energy.project.electricityTypeSetting.mapper;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.entity.ElectricityTypeSetting;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.vo.ElectricityTypeSettingPageListVO;
import java.util.List;
/**
 * è®¡è´¹è§„则Mapper接口
 *
 * @author ruoyi
 * @date 2024-06-14
 */
public interface ElectricityTypeSettingMapper {
    /**
     * æŸ¥è¯¢åˆ—表
     */
    List<ElectricityTypeSettingPageListVO> selectList(String name);
    /**
     * æ ¹æ®id查询详情
     *
     * @param id id
     * @return ç»“æž„
     */
    ElectricityTypeSetting selectById(String id);
    /**
     * æ›´æ–°
     *
     * @param rules è§„则信息
     * @return ç»“æžœ
     */
    int updateRules(ElectricityTypeSetting rules);
    /**
     * æ–°å¢žè§„则
     *
     * @param rules è§„则
     * @return ç»“æžœ
     */
    int insertRules(ElectricityTypeSetting rules);
    /**
     * åˆ é™¤è®¡è´¹è§„则
     *
     * @param id id
     * @return ç»“æžœ
     */
    int deleteRulesById(String id);
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/service/IElectricityDataItemService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.dingzhuo.energy.project.electricityTypeSetting.service;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.dto.ElectricityDataItemListDTO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.vo.PeakAndValleyReportVO;
import java.util.List;
/**
 * å°–峰平谷数据Service接口
 *
 * @author sys
 * @date 2024-08-27
 */
public interface IElectricityDataItemService {
    /**
     * æŸ¥è¯¢ç»Ÿè®¡æ•°æ®
     *
     * @param dto è¯·æ±‚参数
     * @return ç»“æžœ
     */
    List<PeakAndValleyReportVO> getDataStatistics(ElectricityDataItemListDTO dto);
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/service/IElectricityTypeSettingService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.dingzhuo.energy.project.electricityTypeSetting.service;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.dto.ElectricityTypeSettingAddVO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.dto.ElectricityTypeSettingUpdateVO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.vo.ElectricityTypeSettingItemQueryVO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.vo.ElectricityTypeSettingPageListVO;
import java.util.List;
/**
 * è®¡è´¹è§„则Service接口
 *
 * @author ruoyi
 * @date 2024-06-14
 */
public interface IElectricityTypeSettingService {
    /**
     * æŸ¥è¯¢è®¡è´¹è§„则列表
     */
    List<ElectricityTypeSettingPageListVO> selectPageList(String name);
    /**
     * èŽ·å–è®¡è´¹è§„åˆ™è¯¦æƒ…
     */
    ElectricityTypeSettingItemQueryVO getRuleDetail(String id);
    /**
     * ä¿®æ”¹è®¡è´¹ç­–ç•¥
     */
    void updateRule(ElectricityTypeSettingUpdateVO request);
    /**
     * æ–°å¢žè®¡è´¹ç­–ç•¥
     */
    void addRule(ElectricityTypeSettingAddVO request);
    /**
     * åˆ é™¤è®¡è´¹ç­–ç•¥
     */
    void delRule(String id);
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/service/impl/ElectricityDataItemServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
package com.dingzhuo.energy.project.electricityTypeSetting.service.impl;
import cn.hutool.core.date.DateUtil;
import com.dingzhuo.energy.common.utils.time.TimeType;
import com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor;
import com.dingzhuo.energy.data.model.mapper.ModelNodeMapper;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.dto.ElectricityDataItemListDTO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.entity.ElectricityDataItem;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.enums.ElectricityTypeEnum;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.vo.PeakAndValleyReportVO;
import com.dingzhuo.energy.project.electricityTypeSetting.mapper.ElectricityDataItemMapper;
import com.dingzhuo.energy.project.electricityTypeSetting.service.IElectricityDataItemService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
 * å°–峰平谷数据Service业务层处理
 *
 * @author sys
 * @date 2024-08-27
 */
@Service
public class ElectricityDataItemServiceImpl implements IElectricityDataItemService {
    @Resource
    private ModelNodeMapper modelNodeMapper;
    @Resource
    private ElectricityDataItemMapper electricityDataItemMapper;
    /**
     * æŸ¥è¯¢ç»Ÿè®¡æ•°æ®
     *
     * @param dto è¯·æ±‚参数
     * @return ç»“æžœ
     */
    @Override
    public List<PeakAndValleyReportVO> getDataStatistics(ElectricityDataItemListDTO dto) {
        List<PeakAndValleyReportVO> reportVOList = new ArrayList<>();
        // æŸ¥è¯¢æ—¶é—´èŒƒå›´
        Date startTime = DateUtil.beginOfMonth(dto.getQueryTime());
        Date endTime = DateUtil.endOfMonth(startTime);
        String timeType = dto.getTimeType();
        Map<String, List<ElectricityDataItem>> electricityDataMap = new HashMap<>();
        // æŸ¥è¯¢ç‚¹ä½ä¿¡æ¯
        List<ModelNodeIndexInfor> nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId());
        if (CollectionUtils.isNotEmpty(nodeIndexInfoList)) {
            Set<String> indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toSet());
            List<ElectricityDataItem> dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, startTime, endTime, timeType);
            electricityDataMap = dataItemList.stream()
                    .collect(Collectors.groupingBy(li -> DateUtil.formatDateTime(li.getDataTime())));
        }
        while (!startTime.after(endTime)) {
            String mapKey = DateUtil.formatDateTime(startTime);
            List<ElectricityDataItem> dataItemList = electricityDataMap.get(mapKey);
            BigDecimal sharpFee = BigDecimal.ZERO;
            BigDecimal sharpPower = BigDecimal.ZERO;
            BigDecimal peakFee = BigDecimal.ZERO;
            BigDecimal peakPower = BigDecimal.ZERO;
            BigDecimal flatFee = BigDecimal.ZERO;
            BigDecimal flatPower = BigDecimal.ZERO;
            BigDecimal valleyFee = BigDecimal.ZERO;
            BigDecimal valleyPower = BigDecimal.ZERO;
            if (CollectionUtils.isNotEmpty(dataItemList)) {
                for (ElectricityDataItem electricityDataItem : dataItemList) {
                    String electricityType = electricityDataItem.getElectricityType();
                    if (ElectricityTypeEnum.SHARP.name().equals(electricityType)) {
                        sharpFee = sharpFee.add(electricityDataItem.getCost());
                        sharpPower = sharpPower.add(electricityDataItem.getElectricity());
                    } else if (ElectricityTypeEnum.PEAK.name().equals(electricityType)) {
                        peakFee = peakFee.add(electricityDataItem.getCost());
                        peakPower = peakPower.add(electricityDataItem.getElectricity());
                    } else if (ElectricityTypeEnum.FLAT.name().equals(electricityType)) {
                        flatFee = flatFee.add(electricityDataItem.getCost());
                        flatPower = flatPower.add(electricityDataItem.getElectricity());
                    } else {
                        valleyFee = valleyFee.add(electricityDataItem.getCost());
                        valleyPower = valleyPower.add(electricityDataItem.getElectricity());
                    }
                }
            }
            PeakAndValleyReportVO peakAndValleyReportVO = new PeakAndValleyReportVO(startTime, sharpFee, sharpPower,
                    peakFee, peakPower, flatFee, flatPower, valleyFee, valleyPower);
            reportVOList.add(peakAndValleyReportVO);
            switch (TimeType.valueOf(timeType)) {
                case HOUR:
                    startTime = DateUtil.offsetHour(startTime, 1);
                    break;
                case DAY:
                    startTime = DateUtil.offsetDay(startTime, 1);
                    break;
                case MONTH:
                    startTime = DateUtil.offsetMonth(startTime, 1);
                    break;
                default:
                    startTime = DateUtil.offsetMonth(startTime, 12);
                    break;
            }
        }
        return reportVOList;
    }
}
energy_management_server/src/main/java/com/dingzhuo/energy/project/electricityTypeSetting/service/impl/ElectricityTypeSettingServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,186 @@
package com.dingzhuo.energy.project.electricityTypeSetting.service.impl;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.dto.ElectricityTypeSettingAddVO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.dto.ElectricityTypeSettingItemAddVO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.dto.ElectricityTypeSettingItemUpdateVO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.dto.ElectricityTypeSettingUpdateVO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.entity.ElectricityTypeSetting;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.entity.ElectricityTypeSettingItem;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.enums.ElectricityTypeEnum;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.vo.ElectricityTypeSettingItemQueryVO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.vo.ElectricityTypeSettingItemVO;
import com.dingzhuo.energy.project.electricityTypeSetting.domain.vo.ElectricityTypeSettingPageListVO;
import com.dingzhuo.energy.project.electricityTypeSetting.mapper.ElectricityTypeSettingItemMapper;
import com.dingzhuo.energy.project.electricityTypeSetting.mapper.ElectricityTypeSettingMapper;
import com.dingzhuo.energy.project.electricityTypeSetting.service.IElectricityTypeSettingService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
/**
 * è®¡è´¹è§„则Service业务层处理
 *
 * @author ruoyi
 * @date 2024-06-14
 */
@Service
public class ElectricityTypeSettingServiceImpl implements IElectricityTypeSettingService {
    @Resource
    private ElectricityTypeSettingMapper rulesMapper;
    @Resource
    private ElectricityTypeSettingItemMapper ruleDetailsMapper;
    /**
     * æŸ¥è¯¢è®¡è´¹è§„则列表
     */
    @Override
    public List<ElectricityTypeSettingPageListVO> selectPageList(String name) {
        List<ElectricityTypeSettingPageListVO> rulesPageListVOList = rulesMapper.selectList(name);
        if (CollectionUtils.isEmpty(rulesPageListVOList)) {
            return rulesPageListVOList;
        }
        Date maxEffectiveDate = new Date();
        Date date = new Date();
        for (ElectricityTypeSettingPageListVO vo : rulesPageListVOList) {
            Date effectiveDate = vo.getEffectiveDate();
            // åˆ¤æ–­å¹¶è®¾ç½® effective å±žæ€§
            if (effectiveDate.before(date) && effectiveDate.after(maxEffectiveDate)) {
                maxEffectiveDate = effectiveDate;
                vo.setEffective(true);
            }
        }
        return rulesPageListVOList;
    }
    /**
     * èŽ·å–è®¡è´¹è§„åˆ™è¯¦æƒ…
     */
    @Override
    public ElectricityTypeSettingItemQueryVO getRuleDetail(String id) {
        ElectricityTypeSettingItemQueryVO rulesDetailQueryResponse = new ElectricityTypeSettingItemQueryVO();
        ElectricityTypeSetting rules = rulesMapper.selectById(id);
        if (ObjectUtils.isEmpty(rules)) {
            return rulesDetailQueryResponse;
        }
        BeanUtils.copyProperties(rules, rulesDetailQueryResponse);
        List<ElectricityTypeSettingItem> detailsList = ruleDetailsMapper.selectListByRuleId(id);
        if (ObjectUtils.isNotEmpty(detailsList)) {
            List<ElectricityTypeSettingItemVO> ruleDetailList = new ArrayList<>();
            for (ElectricityTypeSettingItem ruleDetails : detailsList) {
                ElectricityTypeSettingItemVO ruleDetailsResponse = new ElectricityTypeSettingItemVO();
                BeanUtils.copyProperties(ruleDetails, ruleDetailsResponse);
                ruleDetailsResponse.setTypeDesc(ElectricityTypeEnum.getNameByType(ruleDetails.getType()));
                ruleDetailList.add(ruleDetailsResponse);
            }
            rulesDetailQueryResponse.setRuleDetailList(ruleDetailList);
        }
        return rulesDetailQueryResponse;
    }
    /**
     * ä¿®æ”¹è®¡è´¹ç­–ç•¥
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateRule(ElectricityTypeSettingUpdateVO request) {
        ElectricityTypeSetting rules = rulesMapper.selectById(request.getId());
        if (ObjectUtils.isEmpty(rules)) {
            throw new RuntimeException("计费规则不存在");
        }
        // åˆ¤æ–­å½“前生效时间不能小于当前日期
        Date now = new Date();
        Date inputDate = request.getEffectiveDate();
        if (inputDate.before(now) || inputDate.equals(now)) {
            throw new RuntimeException("传入时间早于或等于当前时间: " + inputDate);
        }
        List<ElectricityTypeSettingItemUpdateVO> ruleDetailList = request.getRuleDetailList();
        if (ruleDetailList.size() != 48) {
            throw new RuntimeException("收费时间段必须是48条");
        }
        BeanUtils.copyProperties(request, rules);
        rulesMapper.updateRules(rules);
        for (ElectricityTypeSettingItemUpdateVO ruleDetailsRequest : ruleDetailList) {
            ElectricityTypeSettingItem ruleDetails = new ElectricityTypeSettingItem();
            ruleDetails.setId(ruleDetailsRequest.getId());
            ruleDetails.setType(ruleDetailsRequest.getType());
            if (ObjectUtils.isNotEmpty(ruleDetailsRequest.getRemark())) {
                ruleDetails.setRemark(ruleDetailsRequest.getRemark());
            }
            ruleDetailsMapper.updateRuleDetails(ruleDetails);
        }
    }
    /**
     * æ–°å¢žè®¡è´¹ç­–ç•¥
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addRule(ElectricityTypeSettingAddVO request) {
        Date effectiveDate = request.getEffectiveDate();
        Date now = new Date();
        if (effectiveDate.before(now) || effectiveDate.equals(now)) {
            throw new RuntimeException("传入时间早于或等于当前时间");
        }
        List<ElectricityTypeSettingItemAddVO> ruleDetailList = request.getRuleDetailList();
        if (ruleDetailList.size() != 48) {
            throw new RuntimeException("收费时间段必须是48条!");
        }
        List<Integer> timePeriodList = ruleDetailList.stream().distinct().map(ElectricityTypeSettingItemAddVO::getTimePeriod).collect(Collectors.toList());
        if (timePeriodList.size() != ruleDetailList.size()) {
            throw new RuntimeException("收费时间段不能重复!");
        }
        Date createTime = new Date();
        ElectricityTypeSetting rules = new ElectricityTypeSetting();
        BeanUtils.copyProperties(request, rules);
        rules.setId(UUID.randomUUID().toString());
        rules.setCreateTime(createTime);
        rulesMapper.insertRules(rules);
        for (ElectricityTypeSettingItemAddVO ruleDetailsAddRequest : ruleDetailList) {
            ElectricityTypeSettingItem ruleDetails = new ElectricityTypeSettingItem();
            ruleDetails.setRuleId(rules.getId());
            BeanUtils.copyProperties(ruleDetailsAddRequest, ruleDetails);
            ruleDetails.setId(UUID.randomUUID().toString());
            ruleDetails.setCreateTime(createTime);
            ruleDetailsMapper.insertRuleDetails(ruleDetails);
        }
    }
    /**
     * åˆ é™¤è®¡è´¹ç­–ç•¥
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delRule(String id) {
        ElectricityTypeSetting rules = rulesMapper.selectById(id);
        if (ObjectUtils.isEmpty(rules)) {
            throw new RuntimeException("计费规则不存在");
        }
        rulesMapper.deleteRulesById(id);
        ruleDetailsMapper.deleteRulesByRuleId(id);
    }
}
energy_management_server/src/main/resources/application.yml
@@ -1,7 +1,7 @@
# é¡¹ç›®ç›¸å…³é…ç½®
ruoyi:
  # åç§°
  name: ä¸œä¸½åŒ»ç–—
  name: æ™ºç¢³æœªæ¥EMS
  # ç‰ˆæœ¬
  version: 1.0.0
  # ç‰ˆæƒå¹´ä»½
energy_management_server/src/main/resources/mybatis/electricityTypeSetting/ElectricityDataItemMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dingzhuo.energy.project.electricityTypeSetting.mapper.ElectricityDataItemMapper">
    <select id="getDataStatistics"
            resultType="com.dingzhuo.energy.project.electricityTypeSetting.domain.entity.ElectricityDataItem">
        SELECT
        index_code indexCode,
        time_code timeCode,
        electricity_type electricityType,
        data_time dataTime,
        electricity,
        "cost",
        time_type timeType,
        price,
        remark
        FROM
        "electricity_data_item"
        WHERE
        index_id IN
        <foreach collection="indexIdSet" item="indexId" open="(" separator="," close=")">
            #{indexId}
        </foreach>
        AND (data_time BETWEEN #{startTime} AND #{endTime})
        AND time_type = #{timeType}
    </select>
</mapper>
energy_management_server/src/main/resources/mybatis/electricityTypeSetting/ElectricityTypeSettingItemMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dingzhuo.energy.project.electricityTypeSetting.mapper.ElectricityTypeSettingItemMapper">
    <sql id="selectRuleDetailsVo">
        select id,
               rule_id,
               start_time,
               end_time,
               type,
               dept_id,
               del_flag,
               create_by,
               create_time,
               update_by,
               update_time,
               remark
        from electricity_type_setting_item
    </sql>
    <select id="selectListByRuleId"
            resultType="com.dingzhuo.energy.project.electricityTypeSetting.domain.entity.ElectricityTypeSettingItem">
        SELECT *
        FROM electricity_type_setting_item
        WHERE rule_id = #{id}
    </select>
    <insert id="insertRuleDetails" parameterType="ElectricityTypeSettingItem">
        insert into electricity_type_setting_item
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null ">id,</if>
            <if test="ruleId != null ">rule_id,</if>
            <if test="type != null ">type,</if>
            <if test="deptId != null ">dept_id,</if>
            <if test="delFlag != null ">del_flag,</if>
            <if test="createBy != null  and createBy != ''">create_by,</if>
            <if test="createTime != null ">create_time,</if>
            <if test="updateBy != null  and updateBy != ''">update_by,</if>
            <if test="updateTime != null ">update_time,</if>
            <if test="remark != null  and remark != ''">remark,</if>
            <if test="timePeriod != null ">time_period,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null ">#{id},</if>
            <if test="ruleId != null ">#{ruleId},</if>
            <if test="type != null ">#{type},</if>
            <if test="deptId != null ">#{deptId},</if>
            <if test="delFlag != null ">#{delFlag},</if>
            <if test="createBy != null  and createBy != ''">#{createBy},</if>
            <if test="createTime != null ">#{createTime},</if>
            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
            <if test="updateTime != null ">#{updateTime},</if>
            <if test="remark != null  and remark != ''">#{remark},</if>
            <if test="timePeriod != null ">#{timePeriod},</if>
        </trim>
    </insert>
    <update id="updateRuleDetails" parameterType="ElectricityTypeSettingItem">
        update electricity_type_setting_item
        <trim prefix="SET" suffixOverrides=",">
            <if test="ruleId != null ">rule_id = #{ruleId},</if>
            <if test="type != null ">type = #{type},</if>
            <if test="deptId != null ">dept_id = #{deptId},</if>
            <if test="delFlag != null ">del_flag = #{delFlag},</if>
            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
            <if test="createTime != null ">create_time = #{createTime},</if>
            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
            <if test="updateTime != null ">update_time = #{updateTime},</if>
            <if test="remark != null  and remark != ''">remark = #{remark},</if>
            <if test="timePeriod != null ">time_period = #{timePeriod},</if>
        </trim>
        where id = #{id}
    </update>
    <delete id="deleteRuleDetailsById">
        delete
        from electricity_type_setting_item
        where id = #{id}
    </delete>
    <delete id="deleteRulesByRuleId">
        delete
        from electricity_type_setting_item
        where rule_id = #{ruleId}
    </delete>
</mapper>
energy_management_server/src/main/resources/mybatis/electricityTypeSetting/ElectricityTypeSettingMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dingzhuo.energy.project.electricityTypeSetting.mapper.ElectricityTypeSettingMapper">
    <select id="selectList"
            resultType="com.dingzhuo.energy.project.electricityTypeSetting.domain.vo.ElectricityTypeSettingPageListVO">
        select
        id,
        name,
        sharp_fee AS sharpFee,
        peak_fee AS peakFee,
        flat_fee AS flatFee,
        valley_fee AS valleyFee,
        create_by AS createBy,
        create_time AS createTime,
        effective_date AS effectiveDate,
        remark
        from electricity_type_setting
        <where>
            <if test="name != null  and name != ''">
                and name like concat('%', #{name}, '%')
            </if>
            and del_flag = '0'
        </where>
        order by create_time desc
    </select>
    <select id="selectById"
            resultType="com.dingzhuo.energy.project.electricityTypeSetting.domain.entity.ElectricityTypeSetting">
        select id,
               name,
               effective_date,
               sharp_fee,
               peak_fee,
               flat_fee,
               valley_fee,
               effective_date,
               create_by,
               create_time,
               update_by,
               update_time,
               remark
        from electricity_type_setting
        where id = #{id}
    </select>
    <insert id="insertRules" parameterType="ElectricityTypeSetting">
        insert into electricity_type_setting
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null ">id,</if>
            <if test="name != null  and name != ''">name,</if>
            <if test="sharpFee != null ">sharp_fee,</if>
            <if test="peakFee != null ">peak_fee,</if>
            <if test="flatFee != null ">flat_fee,</if>
            <if test="valleyFee != null ">valley_fee,</if>
            <if test="effectiveDate != null ">effective_date,</if>
            <if test="deptId != null ">dept_id,</if>
            <if test="delFlag != null ">del_flag,</if>
            <if test="createBy != null  and createBy != ''">create_by,</if>
            <if test="createTime != null ">create_time,</if>
            <if test="updateBy != null  and updateBy != ''">update_by,</if>
            <if test="updateTime != null ">update_time,</if>
            <if test="remark != null  and remark != ''">remark,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null ">#{id},</if>
            <if test="name != null  and name != ''">#{name},</if>
            <if test="sharpFee != null ">#{sharpFee},</if>
            <if test="peakFee != null ">#{peakFee},</if>
            <if test="flatFee != null ">#{flatFee},</if>
            <if test="valleyFee != null ">#{valleyFee},</if>
            <if test="effectiveDate != null ">#{effectiveDate},</if>
            <if test="deptId != null ">#{deptId},</if>
            <if test="delFlag != null ">#{delFlag},</if>
            <if test="createBy != null  and createBy != ''">#{createBy},</if>
            <if test="createTime != null ">#{createTime},</if>
            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
            <if test="updateTime != null ">#{updateTime},</if>
            <if test="remark != null  and remark != ''">#{remark},</if>
        </trim>
    </insert>
    <update id="updateRules" parameterType="ElectricityTypeSetting">
        update electricity_type_setting
        <trim prefix="SET" suffixOverrides=",">
            <if test="name != null  and name != ''">name = #{name},</if>
            <if test="sharpFee != null ">sharp_fee = #{sharpFee},</if>
            <if test="peakFee != null ">peak_fee = #{peakFee},</if>
            <if test="flatFee != null ">flat_fee = #{flatFee},</if>
            <if test="valleyFee != null ">valley_fee = #{valleyFee},</if>
            <if test="effectiveDate != null ">valley_fee = #{effectiveDate},</if>
            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
            <if test="createTime != null ">create_time = #{createTime},</if>
            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
            <if test="updateTime != null ">update_time = #{updateTime},</if>
            <if test="remark != null  and remark != ''">remark = #{remark},</if>
        </trim>
        where id = #{id}
    </update>
    <delete id="deleteRulesById">
        delete
        from electricity_type_setting
        where id = #{id}
    </delete>
</mapper>
energy_management_ui/src/api/energyPrice/price.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
import request from "@/utils/request";
export default {
  // æŸ¥è¯¢å‚数列表
  pageRule(query) {
    return request({
      url: "/rule/list",
      method: "get",
      params: query
    });
  },
  addRule(query) {
    return request({
      url: "/rule/addRule",
      method: "post",
      data: query
    });
  },
  editRule(query) {
    return request({
      url: "/rule/updateRule",
      method: "post",
      data: query
    });
  },
  delRule(query) {
    return request({
      url: "/rule/delRule/" + query.id,
      method: "delete",
      params: query
    });
  },
  getRuleDetail(query) {
    return request({
      url: "/rule/getRuleDetail",
      method: "get",
      params: query
    });
  }
};
energy_management_ui/src/assets/home/homeiconD.png
energy_management_ui/src/assets/home/homeiconDQ.png
energy_management_ui/src/assets/home/homeiconJ.png
energy_management_ui/src/assets/home/homeiconT.png
energy_management_ui/src/assets/home/homeiconW.png
energy_management_ui/src/assets/home/homeiconY.png
energy_management_ui/src/assets/home/homeicontitle.png
energy_management_ui/src/assets/icons/checkbox.png
energy_management_ui/src/assets/icons/checked.png
energy_management_ui/src/assets/image/bg.jpg
energy_management_ui/src/assets/image/breadcrumbBg.png
energy_management_ui/src/assets/image/isbreadcrumbBg.png
energy_management_ui/src/assets/image/navbar/Group.png
energy_management_ui/src/assets/image/treeBg.png
energy_management_ui/src/layout/index.vue
@@ -9,9 +9,25 @@
    <div :class="{ hasTagsView: needTagsView }" class="main-container">
      <div :class="{ 'fixed-header': fixedHeader }">
        <navbar />
        <!-- <div style="height: 70px;background: #fff;">
          caidan-菜单
        </div> -->
        <div class="tabs-container">
          <el-tabs
            v-model="activePage"
            type="card"
            closable
            @edit="handleTabsEdit"
          >
            <el-tab-pane
              :id="page.fullPath"
              :key="page.fullPath"
              v-for="(page, index) in pageList"
              :label="page.meta.title"
              :name="page.fullPath"
              :closable="!(page.meta.title == '首页')"
            >
              <!-- {{ page.content }} -->
            </el-tab-pane>
          </el-tabs>
        </div>
      </div>
      <app-main />
    </div>
@@ -24,6 +40,7 @@
import ResizeMixin from "./mixin/ResizeHandler";
import { mapState } from "vuex";
const indexKey = "/index";
export default {
  name: "Layout",
  components: {
@@ -32,6 +49,14 @@
    RightPanel,
    Sidebar
  },
  data() {
    return {
      pageList: [],
      linkList: [],
      activePage: "",
      multipage: true
    };
  },
  mixins: [ResizeMixin],
  computed: {
    ...mapState({
@@ -39,7 +64,8 @@
      device: state => state.app.device,
      showSettings: state => state.settings.showSettings,
      needTagsView: state => state.settings.tagsView,
      fixedHeader: state => state.settings.fixedHeader
      fixedHeader: state => state.settings.fixedHeader,
      tagsView: state => state.tagsView
    }),
    classObj() {
      return {
@@ -50,7 +76,117 @@
      };
    }
  },
  created() {
    if (this.$route.path !== indexKey) {
      this.addIndexToFirst();
    }
    // å¤åˆ¶ä¸€ä¸ªroute对象出来,不能影响原route
    let currentRoute = Object.assign({}, this.$route);
    currentRoute.meta = Object.assign({}, currentRoute.meta);
    this.pageList.push(currentRoute);
    this.linkList.push(currentRoute.fullPath);
    this.activePage = currentRoute.fullPath;
    console.log("pageList", this.pageList);
  },
  watch: {
    $route: function(newRoute) {
      this.activePage = newRoute.fullPath;
      if (!this.multipage) {
        this.linkList = [newRoute.fullPath];
        this.pageList = [Object.assign({}, newRoute)];
        // update-begin-author:taoyan date:20200211 for: TASK #3368 ã€è·¯ç”±ç¼“存】首页的缓存设置有问题,需要根据后台的路由配置来实现是否缓存
      } else if (indexKey == newRoute.fullPath) {
        //首页时 åˆ¤æ–­æ˜¯å¦ç¼“å­˜ æ²¡æœ‰ç¼“å­˜ åˆ·æ–°ä¹‹
        if (newRoute.meta.keepAlive === false) {
          this.routeReload();
        }
        // update-end-author:taoyan date:20200211 for: TASK #3368 ã€è·¯ç”±ç¼“存】首页的缓存设置有问题,需要根据后台的路由配置来实现是否缓存
      } else if (this.linkList.indexOf(newRoute.fullPath) < 0) {
        this.linkList.push(newRoute.fullPath);
        this.pageList.push(Object.assign({}, newRoute));
        //// update-begin-author:sunjianlei date:20200103 for: å¦‚果新增的页面配置了缓存路由,那么就强制刷新一遍 #842
        // if (newRoute.meta.keepAlive) {
        //   this.routeReload()
        // }
        //// update-end-author:sunjianlei date:20200103 for: å¦‚果新增的页面配置了缓存路由,那么就强制刷新一遍 #842
      } else if (this.linkList.indexOf(newRoute.fullPath) >= 0) {
        let oldIndex = this.linkList.indexOf(newRoute.fullPath);
        let oldPositionRoute = this.pageList[oldIndex];
        this.pageList.splice(
          oldIndex,
          1,
          Object.assign({}, newRoute, { meta: oldPositionRoute.meta })
        );
      }
    },
    activePage: function(key) {
      let index = this.linkList.lastIndexOf(key);
      let waitRouter = this.pageList[index];
      // ã€TESTA-523】修复:不允许重复跳转路由异常
      if (waitRouter.fullPath !== this.$route.fullPath) {
        this.$router.push(Object.assign({}, waitRouter));
      }
      // this.changeTitle(waitRouter.meta.title);
    }
  },
  methods: {
    addIndexToFirst() {
      this.pageList.splice(0, 0, {
        name: "home",
        path: indexKey,
        fullPath: indexKey,
        meta: {
          icon: "dashboard",
          title: "首页"
        }
      });
      this.linkList.splice(0, 0, indexKey);
    },
    changePage(key) {
      this.activePage = key;
    },
    handleTabsEdit(key, action) {
      console.log("handleTabsEdit", key, action);
      this[action](key);
    },
    remove(key) {
      if (key == indexKey) {
        this.$message({
          message: "首页不能关闭!",
          type: "warning"
        });
        return;
      }
      if (this.pageList.length === 1) {
        this.$message({
          message: "这是最后一页,不能再关闭了啦",
          type: "warning"
        });
        return;
      }
      let removeRoute = this.pageList.filter(item => item.fullPath == key);
      this.pageList = this.pageList.filter(item => item.fullPath !== key);
      let index = this.linkList.indexOf(key);
      this.linkList = this.linkList.filter(item => item !== key);
      index = index >= this.linkList.length ? this.linkList.length - 1 : index;
      this.activePage = this.linkList[index];
      //update-begin--Author:scott  Date:20201015 for:路由缓存问题,关闭了tab页时再打开就不刷新 #842
      //关闭页面则从缓存cache_included_routes中删除路由,下次点击菜单会重新加载页面
      // let cacheRouterArray = Vue.ls.get(CACHE_INCLUDED_ROUTES) || [];
      // if (removeRoute && removeRoute[0]) {
      //   let componentName = removeRoute[0].meta.componentName;
      //   if (cacheRouterArray.includes(componentName)) {
      //     cacheRouterArray.splice(
      //       cacheRouterArray.findIndex(item => item === componentName),
      //       1
      //     );
      //     Vue.ls.set(CACHE_INCLUDED_ROUTES, cacheRouterArray);
      //   }
      //   this.emitPageClosed(removeRoute[0]);
      // }
      //update-end--Author:scott  Date:20201015 for:路由缓存问题,关闭了tab页时再打开就不刷新 #842
    },
    handleClickOutside() {
      this.$store.dispatch("app/closeSideBar", { withoutAnimation: false });
    }
@@ -67,6 +203,7 @@
  position: relative;
  height: 100%;
  width: 100%;
  background: #001233;
  &.mobile.openSidebar {
    position: fixed;
@@ -74,6 +211,37 @@
  }
}
.tabs-container {
  // background: #fff;
  background: #001233;
  height: #{$tabBarHeight};
  ::v-deep {
    .el-tabs__item {
      height: #{$tabBarHeight};
      line-height: #{$tabBarHeight};
      background: url("../assets/image/breadcrumbBg.png") no-repeat;
      background-size: 100% 100%;
      border: none;
      margin-right: 10px;
      color: #95c1fd;
    }
    .is-active {
      color: #fff;
      background: url("../assets/image/isbreadcrumbBg.png") no-repeat;
      background-size: 100% 100%;
    }
    .el-tabs__nav {
      border: none !important;
    }
    .el-tabs__header {
      margin: 0 !important;
    }
    .el-tabs--card > .el-tabs__header {
      border-bottom: none;
    }
  }
}
.drawer-bg {
  background: #000;
  opacity: 0.3;
energy_management_ui/src/views/electricityPrice/statistics/electricityIndexNew.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,181 @@
<template>
  <div class="app-container">
    <el-form
      :model="queryParams"
      ref="queryForm"
      :inline="true"
      label-width="68px"
    >
      <el-form-item label="统计时间">
        <el-date-picker
          clearable
          size="small"
          style="width: 100%"
          v-model="queryParams.queryTime"
          type="month"
          :clearable="false"
          value-format="yyyy-MM"
          placeholder="选择月份"
        >
        </el-date-picker>
      </el-form-item>
      <el-form-item>
        <el-button
          type="primary"
          icon="el-icon-search"
          size="mini"
          @click="handleQuery"
          >搜索</el-button
        >
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
          >重置</el-button
        >
        <!--<el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport">导出</el-button>-->
      </el-form-item>
    </el-form>
    <el-row :gutter="32">
      <el-col :xs="24" :sm="24" :lg="24">
        <el-table border style="width: 100%" :data="tabledata">
          <el-table-column
            prop="time"
            label="日期"
            width="150"
          ></el-table-column>
          <el-table-column label="尖时段">
            <el-table-column label="电量" prop="sharpPower" />
            <el-table-column label="费用" prop="sharpFee" />
          </el-table-column>
          <el-table-column label="峰时段">
            <el-table-column label="电量" prop="peakPower" />
            <el-table-column label="费用" prop="peakFee" />
          </el-table-column>
          <el-table-column label="平时段">
            <el-table-column label="电量" prop="flatPower" />
            <el-table-column label="费用" prop="flatFee" />
          </el-table-column>
          <el-table-column label="谷时段">
            <el-table-column label="电量" prop="valleyPower" />
            <el-table-column label="费用" prop="valleyFee" />
          </el-table-column>
        </el-table>
      </el-col>
    </el-row>
    <!-- <el-row :gutter="32">
      <el-col :xs="24" :sm="24" :lg="24" >
        <div class="chart-wrapper" style="margin-top: 20px;">
          <pie-chart ref="pieChart" :chart-data="pieChartData"/>
        </div>
      </el-col>
    </el-row> -->
  </div>
</template>
<script>
import { getElectricityDataItemStatistics } from "@/api/electricityPrice/statistics";
import pieChart from "./pieChart";
export default {
  components: { pieChart },
  data() {
    return {
      tablehead: [],
      tabledata: [],
      dateTypeOptions: [],
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        timeType: "MONTH",
        queryTime: "",
        nodeId: undefined,
        modelCode: undefined
      },
      pieChartData: {},
      resultList: [],
      skinName: ""
    };
  },
  created() {
    this.queryParams.queryTime = this.formatDate(new Date());
  },
  methods: {
    modelNodeChange(node) {
      this.queryParams.nodeId = node.id;
      this.queryParams.nodeName = node.label;
      this.getList();
    },
    getList() {
      let params = {
        ...this.queryParams,
        timeType: "MONTH",
        // modelCode: this.$route.query.modelCode
        modelCode: "PEAK_VALLEY"
      };
      getElectricityDataItemStatistics(params).then(response => {
        this.tabledata = response.data;
      });
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    numFilter(value) {
      // æˆªå–当前数据到小数点后的几位
      let realVal = "";
      if (!isNaN(value) && value !== "") {
        realVal = parseFloat(value).toFixed(this.skinName);
      } else {
        realVal = "0.00";
      }
      return realVal;
    },
    getTime() {
      var myDate = new Date();
      var monthFirst = new Date(
        myDate.getFullYear(),
        parseInt(myDate.getMonth())
      );
      this.queryParams.beginTime = this.formatDate(monthFirst);
      //this.queryParams.endTime=this.formatDate(monthFirst);
      this.queryParams.endTime = this.getCurrentMonthLast(monthFirst);
    },
    //获取月份最后一天
    getCurrentMonthLast(endTime) {
      var date = new Date(endTime);
      var year = date.getFullYear();
      var month = date.getMonth() + 1;
      month = month < 10 ? "0" + month : month;
      var day = new Date(year, month, 0);
      let endTimes = "";
      endTimes = year + "-" + month + "-" + day.getDate();
      return endTimes;
    },
    formatDate: function(value) {
      let date = new Date(value);
      let y = date.getFullYear();
      let MM = date.getMonth() + 1;
      MM = MM < 10 ? "0" + MM : MM;
      let d = date.getDate();
      d = d < 10 ? "0" + d : d;
      let h = date.getHours();
      h = h < 10 ? "0" + h : h;
      let m = date.getMinutes();
      m = m < 10 ? "0" + m : m;
      let s = date.getSeconds();
      s = s < 10 ? "0" + s : s;
      return y + "-" + MM;
    }
  }
};
</script>
<style lang="scss">
.el-table td,
.el-table th {
  text-align: center !important;
}
</style>
energy_management_ui/src/views/energyPrice/index copy.vue
energy_management_ui/src/views/energyPrice/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,558 @@
<template>
  <div>
    <basic-container>
      <el-form
        :model="queryParams"
        ref="queryForm"
        label-width="72px"
        class="special-form"
      >
        <el-row :gutter="24">
          <el-col :span="6">
            <el-form-item label="策略名称" prop="name">
              <el-input
                v-model="queryParams.name"
                placeholder="请输入策略名称"
                clearable
                size="small"
                @keyup.enter.native="handleQuery"
              />
            </el-form-item>
          </el-col>
          <el-col :span="18">
            <el-form-item class="operation">
              <el-button
                type="primary"
                icon="el-icon-search"
                size="mini"
                @click="handleQuery"
                >搜索</el-button
              >
              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
                >重置</el-button
              >
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </basic-container>
    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
        <el-col :span="1.5">
          <el-button
            type="primary"
            icon="el-icon-plus"
            size="mini"
            @click="handleAdd"
            >新增
          </el-button>
        </el-col>
      </el-row>
      <el-table
        v-loading="loading"
        :data="tableData"
        :height="height"
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55" align="center" />
        <el-table-column
          label="计费策略名称"
          prop="name"
          :show-overflow-tooltip="true"
        />
        <!-- <el-table-column label="尖费用" prop="sharpFee" />
        <el-table-column label="峰费用" prop="peakFee" />
        <el-table-column label="平费用" prop="flatFee" />
        <el-table-column label="谷费用" prop="valleyFee" /> -->
        <el-table-column label="是否生效" prop="effective" align="center">
          <template slot-scope="scope">
            {{ scope.row.effective ? "是" : "否" }}
          </template>
        </el-table-column>
        <el-table-column label="生效时间" prop="effectiveDate" align="center" />
        <el-table-column label="创建时间" align="center" prop="createTime">
        </el-table-column>
        <el-table-column
          label="操作"
          align="center"
          width="240"
          class-name="small-padding fixed-width"
        >
          <template slot-scope="scope">
            <el-button
              size="mini"
              type="text"
              icon="el-icon-edit"
              @click="handleUpdate(scope.row)"
              >修改
            </el-button>
            <el-button
              size="mini"
              type="text"
              icon="el-icon-delete"
              @click="handleDelete(scope.row)"
              >删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        :total="total"
        :page.sync="queryParams.pageNum"
        :limit.sync="queryParams.pageSize"
        @pagination="getList"
      />
    </basic-container>
    <!-- æ·»åŠ æˆ–ä¿®æ”¹-->
    <el-dialog
      :title="title"
      :visible.sync="open"
      width="1000px"
      class="dialog-form-row"
    >
      <el-form ref="form" :model="form" :rules="rules" label-width="150px">
        <el-form-item class="nav-form-item" label="计费策略名称" prop="name">
          <el-input
            maxlength="20"
            v-model="form.name"
            style="width: 425px"
            placeholder="请输入计费策略名称"
            clearable
          />
        </el-form-item>
        <el-form-item
          class="nav-form-item"
          label="生效时间"
          prop="effectiveDate"
        >
          <el-date-picker
            clearabl
            style="width: 425px"
            v-model="form.effectiveDate"
            type="date"
            value-format="yyyy-MM-dd"
            placeholder="选择生效时间"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item class="nav-form-item" label="备注信息" prop="remark">
          <el-input
            type="textarea"
            maxlength="200"
            v-model="form.remark"
            style="width: 425px"
            placeholder="请输入备注信息"
          />
        </el-form-item>
        <el-form-item class="nav-form-item" label="电费(元/度)">
          <el-row
            v-for="(item, index) in priceTypeList"
            :key="index"
            style="margin-bottom: 5px"
          >
            <el-tag
              :style="
                'margin-right: 20px;color: #fff;background-color: ' +
                  item.cor +
                  ';border-color:' +
                  item.cor
              "
              >{{ item.txt }}</el-tag
            >
            <el-input-number
              v-model="item.price"
              controls-position="right"
              :min="0.0"
              :max="10"
              :step="0.1"
              style="width: 200px; margin-right: 10px"
            ></el-input-number>
          </el-row>
          <div class="tipmincc" style="color: #fff;font-size: 13px;">
            ï¼ˆå³°ã€å¹³ã€è°·æ—¶æ®µä»·æ ¼å‡ä¸ºå¿…填项。因各地电价不同,请根据当地实际电价填写。)
          </div>
        </el-form-item>
        <el-form-item class="nav-form-item" label="时段设置">
          <el-row>
            <el-button
              v-for="(item, index) in priceTypeList"
              :key="index"
              :style="
                'margin-right: 20px;color: #fff;margin-top: 5px;margin-bottom: 20px;background-color: ' +
                  item.cor +
                  ';border-color:' +
                  item.cor
              "
              @click="setTimeType(item.priceType)"
            >
              è®¾ç½®ä¸º{{ item.txt }}
            </el-button>
          </el-row>
          <el-row>
            <div style="display: flex; flex-wrap: wrap">
              <div
                class="time-item"
                v-for="time in timePeriodList"
                :key="time.value"
                @click="time.selected = !time.selected"
              >
                <img
                  class="sel-img"
                  v-if="time.selected"
                  src="@/assets/icons/checked.png"
                  alt=""
                />
                <img
                  class="sel-img"
                  v-else
                  src="@/assets/icons/checkbox.png"
                  alt=""
                />
                <div
                  :style="
                    'color:#fff;background-color: ' +
                      colorArray[time.priceType] +
                      ';border-color:' +
                      colorArray[time.priceType]
                  "
                  class="time-type-div"
                >
                  {{ txtArray[time.priceType] }}
                </div>
                <div style="color: #b1a2a2;">{{ time.time }}</div>
              </div>
            </div>
          </el-row>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
const txtArray = ["", "尖", "å³°", "å¹³", "è°·"];
const colorArray = ["", "#f56c6c", "#e6a23c", "#67c23a", "#909399"];
import ruleApi from "@/api/energyPrice/price";
import { getTimePeriod } from "@/utils/index";
import mixins from "@/layout/mixin/getHeight";
export default {
  name: "energyPrice",
  mixins: [mixins],
  data() {
    return {
      txtArray,
      colorArray,
      // é®ç½©å±‚
      loading: true,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // é€‰ä¸­æ•°ç»„
      codes: [],
      // éžå•个禁用
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ€»æ¡æ•°
      total: 0,
      // è®¡é‡å™¨å…·æ¡£æ¡ˆç»´æŠ¤è¡¨æ ¼æ•°æ®
      tableData: [],
      // å¼¹å‡ºå±‚标题
      title: "",
      // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚
      open: false,
      priceTypeList: [
        {
          id: "",
          priceType: 1,
          price: 1,
          servicePrice: 0.8,
          parkFee: 1,
          occupancyFee: 1,
          txt: "尖时段",
          cor: "#f56c6c"
        },
        {
          id: "",
          priceType: 2,
          price: 1,
          servicePrice: 0.8,
          parkFee: 1,
          occupancyFee: 1,
          txt: "峰时段",
          cor: "#e6a23c"
        },
        {
          id: "",
          priceType: 3,
          price: 1,
          servicePrice: 0.8,
          parkFee: 1,
          occupancyFee: 1,
          txt: "平时段",
          cor: "#67c23a"
        },
        {
          id: "",
          priceType: 4,
          price: 1,
          servicePrice: 0.8,
          parkFee: 1,
          occupancyFee: 1,
          txt: "谷时段",
          cor: "#909399"
        }
      ],
      // ç”¨æˆ·å¯¼å…¥å‚æ•°
      height: null,
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        code: undefined,
        meterName: undefined,
        meterType: undefined,
        measureRange: undefined,
        manufacturer: undefined,
        installactionLocation: undefined
      },
      // è¡¨å•参数
      timePeriodList: [],
      form: {
        sum: 0,
        remark: "",
        ruleType: "",
        name: "",
        effectiveDate: "",
        priceList: []
      },
      // è¡¨å•校验
      rules: {
        name: [
          { required: true, message: "计费策略名称不能为空", trigger: "blur" }
        ]
      }
    };
  },
  created() {
    this.getList();
  },
  methods: {
    setCharts() {
      this.bodyStyle = {
        height: window.innerHeight - 220 + "px",
        overflow: "hidden"
      };
      this.height = window.innerHeight - 340;
    },
    /** æŸ¥è¯¢è®¡é‡å™¨å…·æ¡£æ¡ˆç»´æŠ¤åˆ—表 */
    getList() {
      this.loading = true;
      ruleApi.pageRule(this.queryParams).then(response => {
        this.tableData = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },
    // å–消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // è¡¨å•重置
    reset() {
      this.form = {
        name: undefined
      };
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // å¤šé€‰æ¡†é€‰ä¸­æ•°æ®
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.id);
      this.codes = selection.map(item => item.code);
      this.single = selection.length != 1;
      this.multiple = !selection.length;
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.reset();
      this.open = true;
      this.title = "添加计费策略";
      this.form.name = "";
      this.timePeriodList = [];
      for (let i = 1; i < 49; i++) {
        this.timePeriodList.push({
          value: i,
          time: getTimePeriod(i),
          priceType: 1,
          selected: false
        });
      }
    },
    /** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
    handleUpdate(row) {
      this.reset();
      const id = row.id;
      ruleApi.getRuleDetail({ id }).then(response => {
        let typeNameArr = ["sharp", "peak", "flat", "valley"];
        let typeArr = ["SHARP", "PEAK", "FLAT", "VALLEY"];
        this.form = response.data;
        this.open = true;
        this.title = "修改计费策略";
        let ruleDetailList = response.data.ruleDetailList;
        this.timePeriodList = ruleDetailList.map(item => {
          return {
            ...item,
            value: item.timePeriod,
            time: getTimePeriod(item.timePeriod),
            priceType: typeArr.indexOf(item.type) + 1,
            selected: false,
            id: item.id
          };
        });
        this.priceTypeList.forEach((item, index) => {
          item.price = response.data[typeNameArr[index] + "Fee"];
          item.occupancyFee =
            response.data[typeNameArr[index] + "OccupancyFee"];
          item.parkFee = response.data[typeNameArr[index] + "ParkingFee"];
          item.servicePrice = response.data[typeNameArr[index] + "ServiceFee"];
        });
      });
    },
    setTimeType(type) {
      let arr = this.timePeriodList.filter(f => {
        return f.selected;
      });
      if (arr.length === 0) {
        this.msgWarning("请至少选择一个时段");
        return;
      }
      arr.forEach(element => {
        element.priceType = type;
        element.selected = false;
      });
    },
    /** æäº¤æŒ‰é’® */
    submitForm: function() {
      let typeArr = ["SHARP", "PEAK", "FLAT", "VALLEY"];
      // SHARP( "尖"),
      // PEAK("å³°"),
      // FLAT("å¹³"),
      // VALLEY( "è°·");
      this.$refs["form"].validate(valid => {
        if (valid) {
          let params = {
            name: this.form.name,
            id: this.form.id,
            remark: this.form.remark,
            effectiveDate: this.form.effectiveDate,
            sharpFee: this.priceTypeList[0].price, //尖时段
            peakFee: this.priceTypeList[1].price, //峰时段
            flatFee: this.priceTypeList[2].price, //平时段
            valleyFee: this.priceTypeList[3].price, //谷时段
            ruleDetailList: this.timePeriodList.map(item => {
              return {
                timePeriod: item.value,
                type: typeArr[item.priceType - 1],
                id: item.id || ""
              };
            })
          };
          if (this.form.id != undefined) {
            ruleApi.editRule(params).then(response => {
              if (response.code === 200) {
                this.msgSuccess("修改成功");
                this.open = false;
                this.getList();
              } else {
                this.msgError(response.msg);
              }
            });
          } else {
            ruleApi.addRule(params).then(response => {
              if (response.code === 200) {
                this.msgSuccess("新增成功");
                this.open = false;
                this.getList();
              } else {
                this.msgError(response.msg);
              }
            });
          }
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      const id = row.id;
      const name = row.name;
      this.$confirm('是否确认删除"' + name + '"的数据项?', "警告", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(function() {
          return ruleApi.delRule({ id });
        })
        .then(() => {
          this.getList();
          this.msgSuccess("删除成功");
        })
        .catch(function() {});
    }
  }
};
</script>
<style scoped lang="scss">
.special-form {
  @import "~@/assets/styles/common-table-form.scss";
}
.dialog-form-row {
  .el-row {
    margin-bottom: 0;
  }
}
::v-deep .el-dialog__body {
  height: 75vh;
  overflow: hidden;
  overflow-y: auto;
}
.time-item {
  margin-right: 12px;
  border: 1px solid #eaeaea;
  border-radius: 4px;
  text-align: center;
  margin-bottom: 12px;
  width: 100px;
  position: relative;
  cursor: pointer;
  .time-type-div {
    border-radius: 4px 4px 0 0;
  }
  .sel-img {
    position: absolute;
    width: 15px;
    height: 15px;
    background: #fff;
    border-radius: 2px;
    left: 6px;
    top: 6px;
  }
}
</style>
energy_management_ui/src/views/index copy.vue
@@ -486,7 +486,6 @@
<style lang="scss" scoped>
.home-show {
  background: #f0f2f5;
  overflow: hidden;
  overflow-y: scroll;
  height: calc(100vh - 90px);
energy_management_ui/src/views/index.vue
@@ -23,93 +23,89 @@
        </div>
      </div>
    </el-card> -->
    <el-card
      class="body-left-title"
      :bordered="false"
      style="margin-bottom: 12px;"
    >
      <div slot="header" class="clearfix">
        <span>当日双控数据指标总览</span>
      </div>
      <el-row class="double-data-show-content">
        <el-col :span="5" class="total">
          <img alt="" src="~@/assets/home/zonghe.svg" />
          <div class="left-title-style">
            <div>
              <div>全厂综合能耗</div>
              <div class="unit">{{ summation }} tce</div>
            </div>
          </div>
        </el-col>
        <el-col
          :span="5"
          class="co2"
          v-for="(item, index) in energyStatistic"
          :key="index"
          style="border-left: 1px solid #999;"
        >
          <img
            v-if="item.item.includes('电')"
            src="~@/assets/home/haodian.svg"
            alt=""
          />
          <img
            v-if="item.item.includes('æ°´')"
            src="~@/assets/home/haoshui.svg"
            alt=""
          />
          <img
            v-if="item.item.includes('气')"
            src="~@/assets/home/haoqi.svg"
            alt=""
          />
          <img
            v-if="item.item.includes('蒸汽')"
            src="~@/assets/home/haozhengqi.svg"
            alt=""
          />
          <div class="left-title-style">
            <div>
              <div>
                è€—{{
                  item.item.indexOf("天然") !== -1
                    ? item.item.replace("天然", "")
                    : item.item
                }}量
                {{ item.unit ? `(${item.unit})` : "" }}
              </div>
              <div class="unit">
                {{ item.count || 0 }}
              </div>
            </div>
          </div>
        </el-col>
        <el-col :span="5" class="total" style="border-left: 1px solid #999;">
          <img alt="" src="~@/assets/home/wen.png" />
          <div class="left-title-style">
            <div>
              <div>室外温度</div>
              <div class="unit">{{ temperature }}</div>
            </div>
          </div>
        </el-col>
        <el-col :span="5" class="total" style="border-left: 1px solid #999;">
          <img alt="" src="~@/assets/home/shi.png" />
          <div class="left-title-style">
            <div>
              <div>室外湿度</div>
              <div class="unit">{{ humidity }}</div>
            </div>
          </div>
        </el-col>
      </el-row>
    </el-card>
    <el-row type="flex" class="data-indicator-overview">
      <el-col class="home-body-left">
        <el-card class="body-left-title" :bordered="false">
          <div slot="header" class="clearfix">
            <span>当日双控数据指标总览</span>
          </div>
          <el-row class="double-data-show-content">
            <el-col :span="4" class="total">
              <img alt="" src="~@/assets/home/zonghe.svg" />
              <div class="left-title-style">
                <div>
                  <div>全厂综合能耗</div>
                  <div class="unit">{{ summation }} tce</div>
                </div>
              </div>
            </el-col>
            <el-col
              :span="5"
              class="co2"
              v-for="(item, index) in energyStatistic"
              :key="index"
              style="border-left: 1px solid #e9e9e9;"
            >
              <img
                v-if="item.item.includes('电')"
                src="~@/assets/home/haodian.svg"
                alt=""
              />
              <img
                v-if="item.item.includes('æ°´')"
                src="~@/assets/home/haoshui.svg"
                alt=""
              />
              <img
                v-if="item.item.includes('气')"
                src="~@/assets/home/haoqi.svg"
                alt=""
              />
              <img
                v-if="item.item.includes('蒸汽')"
                src="~@/assets/home/haozhengqi.svg"
                alt=""
              />
              <div class="left-title-style">
                <div>
                  <div>
                    è€—{{
                      item.item.indexOf("天然") !== -1
                        ? item.item.replace("天然", "")
                        : item.item
                    }}量
                    {{ item.unit ? `(${item.unit})` : "" }}
                  </div>
                  <div class="unit">
                    {{ item.count || 0 }}
                  </div>
                </div>
              </div>
            </el-col>
            <el-col
              :span="5"
              class="total"
              style="border-left: 1px solid #e9e9e9;"
            >
              <img alt="" src="~@/assets/home/wen.png" />
              <div class="left-title-style">
                <div>
                  <div>室外温度</div>
                  <div class="unit">{{ temperature }}</div>
                </div>
              </div>
            </el-col>
            <el-col
              :span="5"
              class="total"
              style="border-left: 1px solid #e9e9e9;"
            >
              <img alt="" src="~@/assets/home/shi.png" />
              <div class="left-title-style">
                <div>
                  <div>室外湿度</div>
                  <div class="unit">{{ humidity }}</div>
                </div>
              </div>
            </el-col>
          </el-row>
        </el-card>
        <el-card :bordered="false" class="body-left-title">
          <div slot="header" class="clearfix">
            <span>能源实时监测</span>
@@ -120,7 +116,7 @@
            }}</span>
            <BarChart class="line-content" :chartData="chartDataObj" />
          </div>
          <div class="chart-wrapper" style="border-top: 1px solid #e9e9e9">
          <div class="chart-wrapper" style="border-top: 1px solid #999">
            <span class="chart-left-unit">{{
              `æ°´/单位${monitoringWaterUnit}`
            }}</span>
@@ -169,6 +165,7 @@
            class="second-chat"
            :chartData="secondPieData"
            pieTitle="能耗设备占比"
            height="280px"
          />
        </el-card>
      </el-col>
@@ -187,7 +184,6 @@
  getHomeOutdoorTemperature
} from "@/api/home/home";
import mixins from "@/layout/mixin/getHeight";
import moment from "moment";
import PieChart from "./dashboard/PieChart";
import LineChart from "./dashboard/LineChart";
import BarChart from "./dashboard/BarChart";
@@ -256,9 +252,9 @@
    clearInterval(this.timer);
    clearInterval(this.timer30);
    this.getHomeOutdoorTemperatureData();
    this.timer = setInterval(() => {
      this.getHomeOutdoorTemperatureData();
    }, 12000);
    // this.timer = setInterval(() => {
    //   this.getHomeOutdoorTemperatureData();
    // }, 12000);
    this.timer30 = setInterval(() => {
      // this.getEnergyType();
      this.getSummationData();
@@ -549,22 +545,53 @@
<style lang="scss" scoped>
.home-show {
  background: #f0f2f5;
  overflow: hidden;
  overflow-y: scroll;
  height: calc(100vh - 90px);
  // height: calc(100vh - 88px);
  .home-head {
    display: flex;
    align-items: center;
    .home-select-label {
      margin-right: 10px;
      color: #000;
      color: #fff;
      font-weight: 600;
    }
    .select-month {
      margin: 0 8px;
    }
  }
  .double-data-show-content {
    display: flex;
    align-items: center;
    // border-bottom: 1px solid #e9e9e9;
    // padding: 23px 0 24px 40px;
    .el-col {
      padding: 23px 0 24px 10px;
    }
    & > div {
      display: flex;
      align-items: center;
    }
    img {
      width: 20px;
      height: 20px;
    }
    .left-title-style {
      display: flex;
      align-items: center;
      margin-left: 10px;
      // border-right: 1px solid #e9e9e9;
      .unit {
        font-size: 22px;
        color: #fff;
        margin-top: 4px;
      }
    }
  }
@@ -575,7 +602,7 @@
      position: absolute;
      top: 16px;
      left: 24px;
      color: #333;
      color: #fff;
      font-size: 18px;
    }
@@ -598,42 +625,9 @@
        margin: 0 16px 0px 0;
      }
      .double-data-show-content {
        display: flex;
        align-items: center;
        // border-bottom: 1px solid #e9e9e9;
        // padding: 23px 0 24px 40px;
        .el-col {
          padding: 23px 0 24px 10px;
        }
        & > div {
          display: flex;
          align-items: center;
        }
        img {
          width: 20px;
          height: 20px;
        }
        .left-title-style {
          display: flex;
          align-items: center;
          margin-left: 10px;
          // border-right: 1px solid #e9e9e9;
          .unit {
            font-size: 22px;
            color: #000000;
            margin-top: 4px;
          }
        }
      }
      .left-line-style {
        padding: 24px;
        color: #000000;
        color: #fff;
        .radio-list {
          width: 122px;
@@ -656,7 +650,7 @@
            position: absolute;
            top: 16px;
            left: 0;
            color: #333;
            color: #fff;
          }
          .line-content {
@@ -700,7 +694,7 @@
                .number {
                  font-size: 24px;
                  color: #000000;
                  color: #fff;
                }
              }
            }
@@ -718,7 +712,7 @@
        .first-chat {
          margin: 10px 0 0 0;
          height: 340px;
          height: 300px;
        }
      }
@@ -727,7 +721,7 @@
        .second-chat {
          margin: 10px 0 0 0;
          height: 340px;
          height: 290px;
        }
        .bottom-description-list {
@@ -744,7 +738,7 @@
            .energy-cost-sum {
              font-size: 24px;
              color: #000000;
              color: #fff;
            }
          }
energy_management_ui/src/views/index_bak.vue
@@ -1,9 +1,8 @@
<template>
  <div class="dashboard-editor-container">
    <panel-group @handleSetLineChartData="handleSetLineChartData" />
    <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
    <el-row style="padding:16px 16px 0;margin-bottom:32px;">
      <line-chart :chart-data="lineChartData" />
    </el-row>
@@ -27,19 +26,18 @@
    <!--&lt;!&ndash;实时&ndash;&gt;-->
    <!--<div class="live">-->
      <!--<div class="live_content">实时报警</div>-->
      <!--<div class="live_number">35</div>-->
    <!--<div class="live_content">实时报警</div>-->
    <!--<div class="live_number">35</div>-->
    <!--</div>-->
  </div>
</template>
<script>
import PanelGroup from './dashboard/PanelGroup'
import LineChart from './dashboard/LineChart'
import RaddarChart from './dashboard/RaddarChart'
import PieChart from './dashboard/PieChart'
import BarChart from './dashboard/BarChart'
import PanelGroup from "./dashboard/PanelGroup";
import LineChart from "./dashboard/LineChart";
import RaddarChart from "./dashboard/RaddarChart";
import PieChart from "./dashboard/PieChart";
import BarChart from "./dashboard/BarChart";
const lineChartData = {
  newVisitis: {
@@ -58,10 +56,10 @@
    expectedData: [130, 140, 141, 142, 145, 150, 160],
    actualData: [120, 82, 91, 154, 162, 140, 130]
  }
}
};
export default {
  name: 'Index',
  name: "Index",
  components: {
    PanelGroup,
    LineChart,
@@ -72,79 +70,77 @@
  data() {
    return {
      lineChartData: lineChartData.newVisitis
    }
    };
  },
  methods: {
    handleSetLineChartData(type) {
      this.lineChartData = lineChartData[type]
      this.lineChartData = lineChartData[type];
    }
  }
}
};
</script>
<style lang="scss" scoped>
.dashboard-editor-container {
  padding: 32px;
  background-color: rgb(240, 242, 245);
  position: relative;
  .chart-wrapper {
    background: #fff;
    padding: 16px 16px 0;
    margin-bottom: 32px;
  }
}
@media (max-width:1024px) {
@media (max-width: 1024px) {
  .chart-wrapper {
    padding: 8px;
  }
}
  .live{
    position: fixed;
    right: 0px;
    top:70px;
    display: flex;
    flex-direction:column;
    justify-content:center;
    align-items:center;
    width: 100px;
    height: 60px;
    background-color: red;
    animation: fade 600ms infinite;
    -webkit-animation: fade 600ms infinite;
  }
  .live_content{
    font-size: 18px;
    color: white;
    font-weight: bold;
  }
  .live_number{
    font-size: 32px;
    color: white;
    font-weight: bolder;
  }
.live {
  position: fixed;
  right: 0px;
  top: 70px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: 100px;
  height: 60px;
  background-color: red;
  animation: fade 600ms infinite;
  -webkit-animation: fade 600ms infinite;
}
.live_content {
  font-size: 18px;
  color: white;
  font-weight: bold;
}
.live_number {
  font-size: 32px;
  color: white;
  font-weight: bolder;
}
@keyframes fade {
  from {
    opacity: 1.0;
    opacity: 1;
  }
  50% {
    opacity: 0.4;
  }
  to {
    opacity: 1.0;
    opacity: 1;
  }
}
@-webkit-keyframes fade {
  from {
    opacity: 1.0;
    opacity: 1;
  }
  50% {
    opacity: 0.4;
  }
  to {
    opacity: 1.0;
    opacity: 1;
  }
}
</style>
energy_management_ui/src/views/login.vue
@@ -6,15 +6,23 @@
        :src="'https://www.toray.cn/shared/images/toray_logo_ch.svg'"
        alt=""
      />
      <div>东丽医疗能源管理平台</div>
      <div>综合能源管理系统</div>
    </div>
    <div class="login">
      <div class="demo-image">
      <!-- <div class="demo-image">
        <el-image style="width: 75%;" :src="logo"></el-image>
      </div>
      </div> -->
      <div class="login-form">
        <el-form ref="loginForm" :model="loginForm" :rules="loginRules">
          <div class="title">用户登录</div>
          <!-- <div class="title">用户登录</div> -->
          <div class="logo-view title">
            <img
              style="width: 100px;margin-right: 30px "
              :src="'https://www.toray.cn/shared/images/toray_logo_ch.svg'"
              alt=""
            />
            <div>综合能源管理系统</div>
          </div>
          <el-form-item prop="username" style="margin-bottom: 21px">
            <el-input
              v-model="loginForm.username"
@@ -170,22 +178,28 @@
<style rel="stylesheet/scss" lang="scss" scoped>
.logo-page {
  height: 100%;
  background-image: url("../assets/image/login-background.png");
  background-image: url("../assets/image/bg.jpg");
  // background-image: url("../assets/image/login-background.png");
  background-size: cover;
  overflow: hidden;
  // background: ;
  // background: linear-gradient(80deg, #073b70 0%, rgba(7, 59, 112, 0) 100%);
  // background: linear-gradient(90deg, #101d32 0%, rgba(0, 0, 0, 0.5) 100%);
  .logo-png {
    font-size: 24px;
    display: flex;
    align-items: center;
    font-weight: bold;
    color: #333;
    color: #fff;
    padding: 3.4% 0 0 74px;
    position: absolute;
  }
  .login {
    display: flex;
    justify-content: space-between;
    // justify-content: space-between;
    justify-content: center;
    padding: 0 17.24%;
    height: calc(100% - 73px * 2);
    align-items: center;
@@ -194,15 +208,29 @@
  .title {
    font-size: 22px;
    color: #38bcbf;
    margin-bottom: 22px;
    margin-bottom: 32px;
    font-weight: 600;
  }
  .login-form {
    border-radius: 10px;
    background: #ffffff;
    width: 32%;
    padding: 25px 25px 5px 25px;
    // background: #ffffff;
    width: 36%;
    padding: 32px 64px;
    // background: #061844;
    border-radius: 4px;
    // box-shadow: 0 7px 14px 6px #2f4b9a;
    margin-top: 6px;
    border: 1px solid #061844;
    background: rgba($color: #ffffff, $alpha: 0.06);
    .logo-view {
      display: flex;
      align-items: center;
      color: #fff;
      font-size: 26px;
      font-weight: 600;
    }
    .el-input {
      height: 38px;
energy_management_ui/vue.config.js
@@ -6,7 +6,7 @@
  return path.join(__dirname, dir);
}
const name = defaultSettings.title || "庞巴迪能源管理系统"; // æ ‡é¢˜
const name = defaultSettings.title || "智碳未来能源管理系统"; // æ ‡é¢˜
const port = process.env.port || process.env.npm_config_port || 80; // ç«¯å£
@@ -33,9 +33,7 @@
    proxy: {
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      [process.env.VUE_APP_BASE_API]: {
        // target: 'http://47.110.84.144:8097',
        target: "http://192.168.0.6:8097",
        // target: "http://q7unm6.natappfree.cc",
        target: "http://localhost:8097",
        changeOrigin: true,
        pathRewrite: {
          ["^" + process.env.VUE_APP_BASE_API]: ""