Przeglądaj źródła

逆变器(列表、添加编辑删除、统计、开关)

zhj 1 rok temu
rodzic
commit
d4e8acb298

+ 85 - 0
src/main/java/com/welampiot/controller/InverterController.java

@@ -0,0 +1,85 @@
+package com.welampiot.controller;
+
+import com.welampiot.common.BaseResult;
+import com.welampiot.common.InterfaceResultEnum;
+import com.welampiot.dto.InverterDevDTO;
+import com.welampiot.service.InverterDevService;
+import com.welampiot.utils.ToolUtils;
+import com.welampiot.vo.InverterVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/inverter")
+public class InverterController extends BaseController {
+    @Autowired
+    private ToolUtils toolUtils;
+
+    @Autowired
+    private InverterDevService inverterDevService;
+
+    /**
+     * 获取逆变器列表
+     */
+    @RequestMapping(value = "/getList", method = RequestMethod.POST)
+    private BaseResult<?> getList(InverterVO inverterVO) {
+        List<InverterDevDTO> inverterList = inverterDevService.getInverterDevListByInverterVO(inverterVO);
+        Integer total = inverterDevService.getInverterTotalByInverterVO(inverterVO);
+        InverterVO inverterVO1 = new InverterVO();
+        inverterVO1.setTotal(total);
+        inverterVO1.setList(inverterList);
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, inverterVO.getVersion(), inverterVO1);
+    }
+
+    /**
+     * 获取逆变器数据统计
+     */
+    @RequestMapping(value = "/statistics", method = RequestMethod.POST)
+    private BaseResult<?> statistics(InverterVO inverterVO) {
+        inverterVO.setSectionList(getSectionList(inverterVO.getUsername()));
+        Integer total = inverterDevService.getInverterTotalByInverterVO(inverterVO);
+        Integer onlineTotal = inverterDevService.getOnlineInverterTotalByInverterVO(inverterVO);
+        InverterVO inverterVO1 = new InverterVO();
+        inverterVO1.setTotal(total);
+        inverterVO1.setOnlineCount(onlineTotal);
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, inverterVO.getVersion(), inverterVO1);
+    }
+
+    /**
+     * 删除设备
+     */
+    @RequestMapping(value = "/del", method = RequestMethod.POST)
+    private BaseResult<?> del(InverterVO inverterVO) {
+        Integer version = inverterVO.getVersion();
+        if (inverterVO.getId() == null || inverterVO.getId() == 0)
+            return toolUtils.response(InterfaceResultEnum.LACK_PARAM_ERROR, version);
+        inverterDevService.deleteInverterDataById(inverterVO.getId());
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, version);
+    }
+
+    /**
+     * 保存设备
+     */
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    private BaseResult<?> save(InverterVO inverterVO) {
+        return inverterDevService.saveInverterDataByInverterVO(inverterVO);
+    }
+
+    /**
+     * 开关设备
+     */
+    @RequestMapping(value = "/setStatus", method = RequestMethod.POST)
+    private BaseResult<?> setStatus(InverterVO inverterVO) {
+        if (inverterVO.getId() == null || inverterVO.getId() == 0 || inverterVO.getStatus() == null)
+            return toolUtils.response(InterfaceResultEnum.LACK_PARAM_ERROR, inverterVO.getVersion());
+        boolean isSuccess = inverterDevService.openCloseInverter(inverterVO.getId(), inverterVO.getStatus());
+        if (!isSuccess) return toolUtils.response(InterfaceResultEnum.COMMAND_FAIL, inverterVO.getVersion());
+        return inverterDevService.saveInverterDataByInverterVO(inverterVO);
+    }
+}

+ 18 - 0
src/main/java/com/welampiot/dao/InverterDevDao.java

@@ -0,0 +1,18 @@
+package com.welampiot.dao;
+
+import com.welampiot.dto.InverterDevDTO;
+import com.welampiot.vo.InverterVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface InverterDevDao {
+    List<InverterDevDTO> getInverterDevListByInverterVO(InverterVO inverterVO);
+    Integer getInverterTotalByInverterVO(InverterVO inverterVO);
+    Integer getOnlineInverterTotalByInverterVO(InverterVO inverterVO);
+    void deleteInverterDataById(@Param("id") Integer id);
+    void addInverterData(InverterDevDTO inverterDevDTO);
+    void updateInverterData(InverterDevDTO inverterDevDTO);
+    Integer checkInverterData(InverterDevDTO inverterDevDTO);
+    InverterDevDTO getInverterDetailsById(@Param("id") Integer id);
+}

+ 7 - 0
src/main/java/com/welampiot/dao/InverterLogDao.java

@@ -0,0 +1,7 @@
+package com.welampiot.dao;
+
+import org.apache.ibatis.annotations.Param;
+
+public interface InverterLogDao {
+    void delInverterLogDataByInverterId(@Param("inverterId") Integer inverterId);
+}

+ 44 - 0
src/main/java/com/welampiot/dto/InverterDevDTO.java

@@ -0,0 +1,44 @@
+package com.welampiot.dto;
+
+import lombok.Data;
+
+@Data
+public class InverterDevDTO {
+    private Integer id;
+    private String number;
+    private String name;
+    private String address;
+    /** 设备在线状态(0 离线,1 在线) */
+    private Integer online;
+    private Integer areaId;
+    private String area;
+    private Integer sectionId;
+    private String section;
+    private String createTime;
+    /** 电池电压 */
+    private Double batteryVoltage;
+    /** 电池电流 */
+    private Double batteryCurrent;
+    /** 电池充电状态 */
+    private Integer batteryStatus;
+    /** 电池剩余电量 */
+    private Integer batterySoc;
+    /** 太阳能板电压 */
+    private Double solarVoltage;
+    /** 太阳能板电流 */
+    private Double solarCurrent;
+    /** 太阳能板功率 */
+    private Double solarPower;
+    /** 当天用电量kWh */
+    private Double dayConsumption;
+    /** 当天发电量kWh */
+    private Double dayGeneration;
+    /** 累计用电量kWh */
+    private Double totalConsumption;
+    /** 累计发电量kWh */
+    private Double totalGeneration;
+    /** 数据更新时间(0 时区) */
+    private String updateTime;
+    /** 开关机状态(0 关机,1 开机) */
+    private Integer status;
+}

+ 20 - 0
src/main/java/com/welampiot/service/InverterDevService.java

@@ -0,0 +1,20 @@
+package com.welampiot.service;
+
+import com.welampiot.common.BaseResult;
+import com.welampiot.dto.InverterDevDTO;
+import com.welampiot.vo.InverterVO;
+
+import java.util.List;
+
+public interface InverterDevService {
+    List<InverterDevDTO> getInverterDevListByInverterVO(InverterVO inverterVO);
+    Integer getInverterTotalByInverterVO(InverterVO inverterVO);
+    Integer getOnlineInverterTotalByInverterVO(InverterVO inverterVO);
+    void deleteInverterDataById(Integer id);
+    void addInverterData(InverterDevDTO inverterDevDTO);
+    void updateInverterData(InverterDevDTO inverterDevDTO);
+    Integer checkInverterData(InverterDevDTO inverterDevDTO);
+    BaseResult<?> saveInverterDataByInverterVO(InverterVO inverterVO);
+    boolean openCloseInverter(Integer id, Integer status);
+    InverterDevDTO getInverterDetailsById(Integer id);
+}

+ 5 - 0
src/main/java/com/welampiot/service/InverterLogService.java

@@ -0,0 +1,5 @@
+package com.welampiot.service;
+
+public interface InverterLogService {
+    void delInverterLogDataByInverterId(Integer inverterId);
+}

+ 141 - 0
src/main/java/com/welampiot/service/impl/InverterDevServiceImpl.java

@@ -0,0 +1,141 @@
+package com.welampiot.service.impl;
+
+import com.welampiot.common.BaseResult;
+import com.welampiot.common.InterfaceResultEnum;
+import com.welampiot.controller.BaseController;
+import com.welampiot.dao.InverterDevDao;
+import com.welampiot.dto.InverterDevDTO;
+import com.welampiot.service.InverterDevService;
+import com.welampiot.service.InverterLogService;
+import com.welampiot.utils.ToolUtils;
+import com.welampiot.vo.InverterVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class InverterDevServiceImpl extends BaseController implements InverterDevService {
+
+    @Autowired
+    private InverterDevDao inverterDevDao;
+
+    @Autowired
+    private InverterLogService inverterLogService;
+
+    @Autowired
+    private ToolUtils toolUtils;
+
+    @Override
+    public List<InverterDevDTO> getInverterDevListByInverterVO(InverterVO inverterVO) {
+        inverterVO.setSectionList(getSectionList(inverterVO.getUsername()));
+        inverterVO.setPageAndCount(inverterVO.getPage(), inverterVO.getCount());
+        return inverterDevDao.getInverterDevListByInverterVO(inverterVO);
+    }
+
+    @Override
+    public Integer getInverterTotalByInverterVO(InverterVO inverterVO) {
+        return inverterDevDao.getInverterTotalByInverterVO(inverterVO);
+    }
+
+    @Override
+    public Integer getOnlineInverterTotalByInverterVO(InverterVO inverterVO) {
+        return inverterDevDao.getOnlineInverterTotalByInverterVO(inverterVO);
+    }
+
+    @Override
+    public void deleteInverterDataById(Integer id) {
+        inverterLogService.delInverterLogDataByInverterId(id);
+        inverterDevDao.deleteInverterDataById(id);
+    }
+
+    @Override
+    public void addInverterData(InverterDevDTO inverterDevDTO) {
+        inverterDevDao.addInverterData(inverterDevDTO);
+    }
+
+    @Override
+    public void updateInverterData(InverterDevDTO inverterDevDTO) {
+        inverterDevDao.updateInverterData(inverterDevDTO);
+    }
+
+    @Override
+    public Integer checkInverterData(InverterDevDTO inverterDevDTO) {
+        return inverterDevDao.checkInverterData(inverterDevDTO);
+    }
+
+    @Override
+    public BaseResult<?> saveInverterDataByInverterVO(InverterVO inverterVO) {
+        BaseResult<?> baseResult = checkInverterField(inverterVO);
+        if (baseResult != null) return baseResult;
+
+        InverterDevDTO inverterDevDTO = new InverterDevDTO();
+        BeanUtils.copyProperties(inverterVO, inverterDevDTO);
+        if (inverterVO.getId() != null && inverterVO.getId() != 0) {
+            // 更新
+            updateInverterData(inverterDevDTO);
+        } else {
+            // 编辑
+            addInverterData(inverterDevDTO);
+        }
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, inverterVO.getVersion());
+    }
+
+    private BaseResult<?> checkInverterField(InverterVO inverterVO) {
+        Integer version = inverterVO.getVersion();
+        if (inverterVO.getAreaId() == null || inverterVO.getAreaId() == 0)
+            return toolUtils.response(InterfaceResultEnum.LACK_AREA_ERROR, version);
+        if (inverterVO.getSectionId() == null || inverterVO.getSectionId() == 0)
+            return toolUtils.response(InterfaceResultEnum.LACK_SECTION_ERROR, version);
+        if (inverterVO.getName() == null || inverterVO.getName().trim().isEmpty())
+            return toolUtils.response(InterfaceResultEnum.LACK_NAME_ERROR, version);
+        if (inverterVO.getNumber() == null || inverterVO.getNumber().trim().isEmpty())
+            return toolUtils.response(InterfaceResultEnum.LACK_NUMBER_ERROR, version);
+        if (inverterVO.getAddress() == null || inverterVO.getAddress().trim().isEmpty())
+            return toolUtils.response(InterfaceResultEnum.LACK_ADDRESS_ERROR, version);
+
+        InverterDevDTO inverterDevDTO1 = new InverterDevDTO();
+        inverterDevDTO1.setAreaId(inverterVO.getAreaId());
+        inverterDevDTO1.setSectionId(inverterVO.getSectionId());
+        inverterDevDTO1.setName(inverterVO.getName());
+        inverterDevDTO1.setId(inverterVO.getId());
+        if (checkInverterData(inverterDevDTO1) > 0)
+            return toolUtils.response(InterfaceResultEnum.DEV_NAME_UNIQUE_ERROR, version);
+        inverterDevDTO1 = new InverterDevDTO();
+        inverterDevDTO1.setId(inverterVO.getId());
+        inverterDevDTO1.setAddress(inverterVO.getAddress());
+        if (checkInverterData(inverterDevDTO1) > 0)
+            return toolUtils.response(InterfaceResultEnum.DEV_ADDRESS_UNIQUE_ERROR, version);
+        inverterDevDTO1 = new InverterDevDTO();
+        inverterDevDTO1.setAreaId(inverterVO.getAreaId());
+        inverterDevDTO1.setSectionId(inverterVO.getSectionId());
+        inverterDevDTO1.setNumber(inverterVO.getNumber());
+        if (checkInverterData(inverterDevDTO1) > 0)
+            return toolUtils.response(InterfaceResultEnum.DEV_NUMBER_UNIQUE_ERROR, version);
+
+        return null;
+    }
+
+    @Override
+    public boolean openCloseInverter(Integer id, Integer status) {
+        InverterDevDTO inverterDevDTO = getInverterDetailsById(id);
+        if (inverterDevDTO == null) return false;
+        return sendSetInverterStatus(inverterDevDTO.getAddress(), status);
+    }
+
+    private boolean sendSetInverterStatus(String address, Integer status) {
+        String cmd = "0106DF00000" + status;
+        String sendTopic = "/WE/TransIn/" + address;
+        String backTopic = "/WE/TransOut/" + address;
+        String crc = toolUtils.getCRC(cmd);
+        cmd += crc;
+        String backResult = toolUtils.sendMqttCmd(sendTopic, toolUtils.hexString2Bytes(cmd), backTopic);
+        return toolUtils.checkCRC(backResult);
+    }
+
+    @Override
+    public InverterDevDTO getInverterDetailsById(Integer id) {
+        return inverterDevDao.getInverterDetailsById(id);
+    }
+}

+ 17 - 0
src/main/java/com/welampiot/service/impl/InverterLogServiceImpl.java

@@ -0,0 +1,17 @@
+package com.welampiot.service.impl;
+
+import com.welampiot.service.InverterLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InverterLogServiceImpl implements InverterLogService {
+
+    @Autowired
+    private InverterLogService inverterLogService;
+
+    @Override
+    public void delInverterLogDataByInverterId(Integer inverterId) {
+        inverterLogService.delInverterLogDataByInverterId(inverterId);
+    }
+}

+ 7 - 0
src/main/java/com/welampiot/utils/ToolUtils.java

@@ -637,6 +637,13 @@ System.out.println(res);
         return result.substring(2, 4)+result.substring(0, 2);
     }
 
+    public boolean checkCRC(String cmd) {
+        if (cmd == null || cmd.length() == 0) return false;
+        String crc = cmd.substring(cmd.length() - 4);
+        String substring = cmd.substring(0, cmd.length() - 4);
+        return crc.equalsIgnoreCase(getCRC(substring));
+    }
+
     public Object getRequestContent(HttpServletRequest request,String key){
         return request.getParameter(key);
     }

+ 20 - 0
src/main/java/com/welampiot/vo/InverterVO.java

@@ -0,0 +1,20 @@
+package com.welampiot.vo;
+
+import com.welampiot.dto.InverterDevDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class InverterVO extends BaseVO {
+    private Integer id;
+    private String name;
+    private String number;
+    private String address;
+    private Integer total;
+    private Integer onlineCount;
+    private Integer status;
+    private List<InverterDevDTO> list;
+}

+ 135 - 0
src/main/resources/mapper/InverterDevMapper.xml

@@ -0,0 +1,135 @@
+<?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.welampiot.dao.InverterDevDao">
+
+    <select id="getInverterDevListByInverterVO" resultType="com.welampiot.dto.InverterDevDTO">
+        select i.id,i.name,i.number,i.address,i.online,i.areaId,i.sectionId,i.createTime,
+               i.updateTime,i.status,i.battery_voltage as batteryVoltage,i.battery_current as batteryCurrtent,
+               i.battery_soc as batterySoc,i.battery_status as batteryStatus,i.solar_voltage as solarVoltage,
+               i.solar_current as solarCurrent,i.solar_power as solarPower,i.total_generation as totalGeneration,
+               i.total_consumption as totalConsumption,i.day_generation as dayGeneration,i.day_consumption as dayConsumption,
+               s.name as section
+               <choose>
+                   <when test="version == 2">
+                       ,gl.ru_name as area
+                   </when>
+                   <when test="version == 1">
+                       ,gl.english_name as area
+                   </when>
+                   <otherwise>
+                       ,gl.chinese_name as area
+                   </otherwise>
+               </choose>
+        from inverter_dev i
+        left join section s on i.sectionId = s.id
+        left join global_location gl on i.areaId = gl.id
+        where 1=1
+        <if test="sectionList != null and sectionList.isEmpty()">
+            and i.sectionId in
+            <foreach collection="sectionList" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="areaId != null and areaId != 0">
+            and i.areaId = #{areaId}
+        </if>
+        <if test="sectionId != null and sectionId != 0">
+            and i.sectionId = #{sectionId}
+        </if>
+        <if test="keyword != null and keyword != ''">
+            and (i.name like '%${keyword}%' or i.address like '%${keyword}%' or i.number like '%${keyword}%')
+        </if>
+        <if test="online != null and online == 1">
+            and i.online = 1
+        </if>
+        <if test="online != null and online == 0">
+            and i.online = 0
+        </if>
+        <if test="page != null and count != null">
+            limit #{page},#{count}
+        </if>
+    </select>
+
+    <select id="getInverterTotalByInverterVO" resultType="Integer">
+        select count(*)
+        from inverter_dev i
+        where 1=1
+        <if test="sectionList != null and sectionList.isEmpty()">
+            and i.sectionId in
+            <foreach collection="sectionList" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="areaId != null and areaId != 0">
+            and i.areaId = #{areaId}
+        </if>
+        <if test="sectionId != null and sectionId != 0">
+            and i.sectionId = #{sectionId}
+        </if>
+    </select>
+
+    <select id="getOnlineInverterTotalByInverterVO" resultType="Integer">
+        select count(*)
+        from inverter_dev i
+        where i.online = 1
+        <if test="sectionList != null and sectionList.isEmpty()">
+            and i.sectionId in
+            <foreach collection="sectionList" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="areaId != null and areaId != 0">
+            and i.areaId = #{areaId}
+        </if>
+        <if test="sectionId != null and sectionId != 0">
+            and i.sectionId = #{sectionId}
+        </if>
+    </select>
+
+    <delete id="deleteInverterDataById">
+        delete
+        from inverter_dev
+        where id = #{id}
+    </delete>
+
+    <insert id="addInverterData" parameterType="com.welampiot.dto.InverterDevDTO" keyProperty="id" useGeneratedKeys="true">
+        insert into inverter_dev(`name`,`number`,address,areaId,sectionId,createTime)
+        values(#{name},#{number},#{address},#{areaId},#{sectionId},now())
+    </insert>
+
+    <update id="updateInverterData" parameterType="com.welampiot.dto.InverterDevDTO">
+        update inverter_dev
+        set
+            `name` = #{name},`number` = #{number},address = #{address},areaId = #{areaId},sectionId = #{sectionId}
+        where
+            id = #{id}
+    </update>
+
+    <select id="checkInverterData" resultType="Integer">
+        select count(*)
+        from inverter_dev i
+        where 1=1
+        <if test="name != null and name != ''">
+            and i.name = #{name}
+        </if>
+        <if test="address != null and address != ''">
+            and i.address = #{address}
+        </if>
+        <if test="areaId != null and areaId != 0">
+            and i.areaId = #{areaId}
+        </if>
+        <if test="sectionId != null and sectionId != 0">
+            and i.sectionId = #{sectionId}
+        </if>
+        <if test="id != null and id != 0">
+            and i.id != #{id}
+        </if>
+    </select>
+
+    <select id="getInverterDetailsById" resultType="com.welampiot.dto.InverterDevDTO">
+        select i.id,i.name,i.address,i.number
+        from inverter_dev i
+        where i.id = #{id}
+    </select>
+
+</mapper>

+ 9 - 0
src/main/resources/mapper/InverterLogMapper.xml

@@ -0,0 +1,9 @@
+<?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.welampiot.dao.InverterLogDao">
+
+    <delete id="delInverterLogDataByInverterId">
+        delete from inverter_dev_log where dev_id = #{inverterId}
+    </delete>
+
+</mapper>