| @@ -7,6 +7,7 @@ import com.iformall.common.ResultData; | |||||
| import com.iformall.controller.base.BaseController; | import com.iformall.controller.base.BaseController; | ||||
| import com.iformall.domain.po.KwBox; | import com.iformall.domain.po.KwBox; | ||||
| import com.iformall.domain.po.KwBoxCmdHistory; | import com.iformall.domain.po.KwBoxCmdHistory; | ||||
| import com.iformall.enums.EnumBoxOnlineStatus; | |||||
| import com.iformall.enums.EnumBoxRegisterStatus; | import com.iformall.enums.EnumBoxRegisterStatus; | ||||
| import com.iformall.service.kw.KwBoxCmdHistoryService; | import com.iformall.service.kw.KwBoxCmdHistoryService; | ||||
| import com.iformall.service.kw.KwBoxService; | import com.iformall.service.kw.KwBoxService; | ||||
| @@ -166,6 +167,7 @@ public class KwBoxV1Controller extends BaseController { | |||||
| KwBox record = new KwBox(); | KwBox record = new KwBox(); | ||||
| record.setId(kwBox.getId()); | record.setId(kwBox.getId()); | ||||
| record.setLastOnlineTime(new Date()); | record.setLastOnlineTime(new Date()); | ||||
| record.setOnlineStatus(EnumBoxOnlineStatus.ONLINE.getCode()); | |||||
| kwBoxService.saveOrUpdate(record); | kwBoxService.saveOrUpdate(record); | ||||
| Instant instant = deviceTime.toInstant(); | Instant instant = deviceTime.toInstant(); | ||||
| @@ -0,0 +1,34 @@ | |||||
| package com.iformall.enums; | |||||
| /** | |||||
| * Created by Stormeye on 2018/08/09. | |||||
| */ | |||||
| public enum EnumBoxOnlineStatus { | |||||
| OFFLINE(0, "离线"), | |||||
| ONLINE(1, "在线"); | |||||
| public static EnumBoxOnlineStatus getEnum(Integer code) { | |||||
| for (EnumBoxOnlineStatus value : values()) { | |||||
| if (value.getCode().equals(code)) { | |||||
| return value; | |||||
| } | |||||
| } | |||||
| return null; | |||||
| } | |||||
| private Integer code; | |||||
| private String message; | |||||
| EnumBoxOnlineStatus(Integer code, String message) { | |||||
| this.code = code; | |||||
| this.message = message; | |||||
| } | |||||
| public Integer getCode() { | |||||
| return code; | |||||
| } | |||||
| public String getMessage() { | |||||
| return message; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,34 @@ | |||||
| package com.iformall.enums; | |||||
| /** | |||||
| * Created by Stormeye on 2018/08/09. | |||||
| */ | |||||
| public enum EnumMeterOnlineStatus { | |||||
| OFFLINE(0, "离线"), | |||||
| ONLINE(1, "在线"); | |||||
| public static EnumMeterOnlineStatus getEnum(Integer code) { | |||||
| for (EnumMeterOnlineStatus value : values()) { | |||||
| if (value.getCode().equals(code)) { | |||||
| return value; | |||||
| } | |||||
| } | |||||
| return null; | |||||
| } | |||||
| private Integer code; | |||||
| private String message; | |||||
| EnumMeterOnlineStatus(Integer code, String message) { | |||||
| this.code = code; | |||||
| this.message = message; | |||||
| } | |||||
| public Integer getCode() { | |||||
| return code; | |||||
| } | |||||
| public String getMessage() { | |||||
| return message; | |||||
| } | |||||
| } | |||||
| @@ -11,6 +11,8 @@ public interface KwMeterDataMapper extends CommonMapper<KwMeterData, Long> { | |||||
| List<KwMeterData> findList(KwMeterData param); | List<KwMeterData> findList(KwMeterData param); | ||||
| List<KwMeterData> findLastRecordList(KwMeterData param); | |||||
| List<KwMeterDataVo> findVoList(KwMeterDataDto param); | List<KwMeterDataVo> findVoList(KwMeterDataDto param); | ||||
| List<KwMeterDataVo> getPower(KwMeterDataDto param); | List<KwMeterDataVo> getPower(KwMeterDataDto param); | ||||
| @@ -79,8 +79,7 @@ public interface KwBoxService { | |||||
| List<String> findMetersAddress(KwBox record); | List<String> findMetersAddress(KwBox record); | ||||
| List<KwMeter> findMeters(KwBox record); | List<KwMeter> findMeters(KwBox record); | ||||
| KwMeter findMeter(KwBox record, String addr); | |||||
| KwBox findByImei(String imei); | KwBox findByImei(String imei); | ||||
| KwMeterData saveMeterData(KwBox record, List<Map<String,String>> metersData, Date deviceTime); | |||||
| void saveMeterData(KwBox record, List<Map<String,String>> metersData, Date deviceTime); | |||||
| } | } | ||||
| @@ -17,6 +17,8 @@ public interface KwMeterDataService { | |||||
| List<KwMeterData> findList(KwMeterData kwMeterData); | List<KwMeterData> findList(KwMeterData kwMeterData); | ||||
| List<KwMeterData> findLastRecordList(KwMeterData kwMeterData); | |||||
| int save(List<KwMeterData> recordList); | int save(List<KwMeterData> recordList); | ||||
| KwMeterDataVo getPower(KwMeterDataDto dto); | KwMeterDataVo getPower(KwMeterDataDto dto); | ||||
| @@ -38,7 +38,12 @@ public interface KwMeterService { | |||||
| */ | */ | ||||
| ResultData saveOrUpdate(KwMeter record); | ResultData saveOrUpdate(KwMeter record); | ||||
| /** | |||||
| * 保存或更新实体 | |||||
| * | |||||
| * @param record | |||||
| */ | |||||
| ResultData updateBatch(KwMeter record); | |||||
| /** | /** | ||||
| * 根据Id删除实体 | * 根据Id删除实体 | ||||
| * | * | ||||
| @@ -8,23 +8,19 @@ import com.iformall.common.ResultData; | |||||
| import com.iformall.domain.po.KwBox; | import com.iformall.domain.po.KwBox; | ||||
| import com.iformall.domain.po.KwMeter; | import com.iformall.domain.po.KwMeter; | ||||
| import com.iformall.domain.po.KwMeterData; | import com.iformall.domain.po.KwMeterData; | ||||
| import com.iformall.enums.EnumBoxStatus; | |||||
| import com.iformall.enums.EnumMeterBindStatus; | |||||
| import com.iformall.enums.EnumMeterStatus; | |||||
| import com.iformall.enums.*; | |||||
| import com.iformall.mapper.KwBoxMapper; | import com.iformall.mapper.KwBoxMapper; | ||||
| import com.iformall.service.kw.KwBoxService; | import com.iformall.service.kw.KwBoxService; | ||||
| import com.iformall.service.kw.KwMeterDataService; | import com.iformall.service.kw.KwMeterDataService; | ||||
| import com.iformall.service.kw.KwMeterService; | import com.iformall.service.kw.KwMeterService; | ||||
| import io.netty.util.internal.StringUtil; | import io.netty.util.internal.StringUtil; | ||||
| import org.apache.rocketmq.common.filter.impl.Op; | |||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||
| import java.util.ArrayList; | |||||
| import java.util.Date; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import java.util.*; | |||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
| @@ -91,54 +87,71 @@ public class KwBoxServiceImpl implements KwBoxService { | |||||
| } | } | ||||
| @Override | @Override | ||||
| public KwMeterData saveMeterData(KwBox kwBox, List<Map<String,String>> metersData, Date deviceTime){ | |||||
| public void saveMeterData(KwBox kwBox, List<Map<String,String>> metersData, Date deviceTime){ | |||||
| if (!metersData.isEmpty()) { | if (!metersData.isEmpty()) { | ||||
| List<KwMeter> kwMeterList = findMeters(kwBox); | |||||
| List<KwMeterData> kwMeterDataList = new ArrayList<>(); | List<KwMeterData> kwMeterDataList = new ArrayList<>(); | ||||
| Date recordTime = new Date(); | Date recordTime = new Date(); | ||||
| final IdWorker idWorker = IdWorker.get(); | final IdWorker idWorker = IdWorker.get(); | ||||
| metersData.stream().forEach(m->{ | |||||
| String addr = m.get(KwBoxService.METER_ADDRESS); | |||||
| String activePower = m.get(KwBoxService.METER_ACTIVE_POWER); //active power | |||||
| KwMeter kwMeter = findMeter(kwBox, addr); | |||||
| if (kwMeter==null) return; | |||||
| KwMeterData kwMeterData = new KwMeterData(); | |||||
| kwMeterData.setId(idWorker.nextId()); | |||||
| kwMeterData.setTenantId(kwBox.getTenantId()); | |||||
| kwMeterData.setAddress(addr); | |||||
| kwMeterData.setBoxId(kwBox.getId()); | |||||
| kwMeterData.setCreateTime(recordTime); | |||||
| kwMeterData.setDeviceTime(deviceTime); | |||||
| kwMeterData.setMeterId(kwMeter.getId()); | |||||
| if (!StringUtil.isNullOrEmpty(activePower)) { | |||||
| kwMeterData.setTotalPower(Integer.parseInt(activePower)); | |||||
| } | |||||
| if (kwMeterData.getTotalPower() != null) { | |||||
| KwMeterData record = new KwMeterData(); | |||||
| record.setBoxId(kwBox.getId()); | |||||
| record.setMeterId(kwMeter.getId()); | |||||
| record.setTotalPower(0); //set in sql not null | |||||
| record.setSortColumns(KwMeterData.Field.DeviceTime_DESC); | |||||
| PageInfo<KwMeterData> kwMeterDataPage = kwMeterDataService.listAsPage(record,1,1); | |||||
| if (kwMeterDataPage.getList().size() > 0) { | |||||
| kwMeterData.setUsedPower( | |||||
| kwMeterData.getTotalPower()-kwMeterDataPage.getList().get(0).getTotalPower()); | |||||
| kwMeterData.setLastDeviceTime(kwMeterDataPage.getList().get(0).getDeviceTime()); | |||||
| kwMeterData.setLastTotalPower(kwMeterDataPage.getList().get(0).getTotalPower()); | |||||
| metersData.stream().forEach(md->{ | |||||
| String address = md.get(KwBoxService.METER_ADDRESS); | |||||
| String activePower = md.get(KwBoxService.METER_ACTIVE_POWER); //active power | |||||
| Optional<KwMeter> kwMeter = kwMeterList.stream().filter(m->m.getAddress().equals(address)).findAny(); | |||||
| if (kwMeter.isPresent()) { | |||||
| KwMeterData kwMeterData = new KwMeterData(); | |||||
| kwMeterData.setId(idWorker.nextId()); | |||||
| kwMeterData.setTenantId(kwBox.getTenantId()); | |||||
| kwMeterData.setAddress(address); | |||||
| kwMeterData.setBoxId(kwBox.getId()); | |||||
| kwMeterData.setCreateTime(recordTime); | |||||
| kwMeterData.setDeviceTime(deviceTime); | |||||
| kwMeterData.setMeterId(kwMeter.get().getId()); | |||||
| if (!StringUtil.isNullOrEmpty(activePower)) { | |||||
| kwMeterData.setTotalPower(Integer.parseInt(activePower)); | |||||
| } | } | ||||
| kwMeterDataList.add(kwMeterData); | |||||
| } | } | ||||
| kwMeterDataList.add(kwMeterData); | |||||
| }); | }); | ||||
| KwMeter kwMeter = new KwMeter(); | |||||
| List<Long> onlines = kwMeterDataList.stream().filter(md->md.getTotalPower()!=null).map(KwMeterData::getMeterId).collect(Collectors.toList()); | |||||
| if (onlines.size() > 0) { | |||||
| kwMeter.setIds(onlines); | |||||
| kwMeter.setOnlineStatus(EnumMeterOnlineStatus.ONLINE.getCode()); | |||||
| kwMeter.setUpdateTime(new Date()); | |||||
| kwMeterService.updateBatch(kwMeter); | |||||
| KwMeterData param = new KwMeterData(); | |||||
| param.setIds(onlines); | |||||
| List<KwMeterData> lastRecordList = kwMeterDataService.findLastRecordList(param); | |||||
| kwMeterDataList.stream().forEach(md->{ | |||||
| Optional<KwMeterData> data = lastRecordList.stream().filter(lr->lr.getMeterId() == md.getMeterId()).findAny(); | |||||
| if (data.isPresent()) { | |||||
| md.setUsedPower( | |||||
| md.getTotalPower()-data.get().getTotalPower()); | |||||
| md.setLastDeviceTime(data.get().getDeviceTime()); | |||||
| md.setLastTotalPower(data.get().getTotalPower()); | |||||
| } | |||||
| }); | |||||
| } | |||||
| List<Long> offlines = kwMeterDataList.stream().filter(md->md.getTotalPower()==null).map(KwMeterData::getMeterId).collect(Collectors.toList()); | |||||
| if (offlines.size() > 0) { | |||||
| kwMeter.setIds(onlines); | |||||
| kwMeter.setOnlineStatus(EnumMeterOnlineStatus.OFFLINE.getCode()); | |||||
| kwMeter.setUpdateTime(new Date()); | |||||
| kwMeterService.updateBatch(kwMeter); | |||||
| } | |||||
| kwMeterDataService.save(kwMeterDataList); | kwMeterDataService.save(kwMeterDataList); | ||||
| } | } | ||||
| return null; | |||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -164,21 +177,4 @@ public class KwBoxServiceImpl implements KwBoxService { | |||||
| return kwMeterService.findList(kwMeter); | return kwMeterService.findList(kwMeter); | ||||
| } | } | ||||
| @Override | |||||
| public KwMeter findMeter(KwBox record, String addr) { | |||||
| KwMeter kwMeter = new KwMeter(); | |||||
| kwMeter.setBoxId(record.getId()); | |||||
| kwMeter.setBindStatus(EnumMeterBindStatus.BIND.getCode()); | |||||
| kwMeter.setStatus(EnumMeterStatus.VALID.getCode()); | |||||
| kwMeter.setAddress(addr); | |||||
| List<KwMeter> kwMeters = kwMeterService.findList(kwMeter); | |||||
| if (kwMeters.isEmpty()) { | |||||
| logger.info("没找到盒子关联的电表: id="+record.getId() +",addr=",kwMeter.getAddress()); | |||||
| return null; | |||||
| } | |||||
| return kwMeters.get(0); | |||||
| } | |||||
| } | } | ||||
| @@ -59,6 +59,11 @@ public class KwMeterDataServiceImpl implements KwMeterDataService { | |||||
| return kwMeterDataMapper.insertList(recordList); | return kwMeterDataMapper.insertList(recordList); | ||||
| } | } | ||||
| @Override | |||||
| public List<KwMeterData> findLastRecordList(KwMeterData kwMeterData) { | |||||
| return kwMeterDataMapper.findLastRecordList(kwMeterData); | |||||
| } | |||||
| @Override | @Override | ||||
| public KwMeterDataVo getPower(KwMeterDataDto dto) | public KwMeterDataVo getPower(KwMeterDataDto dto) | ||||
| { | { | ||||
| @@ -50,6 +50,12 @@ public class KwMeterServiceImpl implements KwMeterService { | |||||
| return new ResultData(); | return new ResultData(); | ||||
| } | } | ||||
| @Override | |||||
| public ResultData updateBatch(KwMeter record) { | |||||
| return new ResultData(); | |||||
| } | |||||
| @Override | @Override | ||||
| public void deleteById(Long id) { | public void deleteById(Long id) { | ||||
| @@ -55,13 +55,36 @@ | |||||
| <if test=" null != sortColumns">order by ${sortColumns}</if> | <if test=" null != sortColumns">order by ${sortColumns}</if> | ||||
| </sql> | </sql> | ||||
| <select id="findList" parameterType="com.iformall.domain.po.KwMeter" resultMap="BaseResultMap"> | |||||
| <select id="findList" parameterType="com.iformall.domain.po.KwMeterData" resultMap="BaseResultMap"> | |||||
| select | select | ||||
| <include refid="allColumns"/> | <include refid="allColumns"/> | ||||
| from kw_meter_data | from kw_meter_data | ||||
| <include refid="dynamicWhereConditions"/> | <include refid="dynamicWhereConditions"/> | ||||
| </select> | </select> | ||||
| <select id="listLastRecordList" parameterType="com.iformall.domain.po.KwMeter" resultMap="BaseResultMap"> | |||||
| select | |||||
| <include refid="allColumns"/> | |||||
| from kw_meter_data | |||||
| join | |||||
| ( | |||||
| select | |||||
| `meter_id` as maxMeterId, | |||||
| max(`create_time`) as maxTime | |||||
| from kw_meter_data | |||||
| where | |||||
| `total_power` is not null | |||||
| `meter_id` in | |||||
| <foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | |||||
| #{idItem} | |||||
| </foreach> | |||||
| group by `meter_id`) temp | |||||
| where | |||||
| create_time = temp.maxTime | |||||
| and meter_id = temp.maxMeterId | |||||
| group by `meter_id` | |||||
| </select> | |||||
| <resultMap id="VoResultMap" type="com.iformall.domain.vo.KwMeterDataVo"> | <resultMap id="VoResultMap" type="com.iformall.domain.vo.KwMeterDataVo"> | ||||
| <result column="tenant_id" jdbcType="VARCHAR" property="tenantId"/> | <result column="tenant_id" jdbcType="VARCHAR" property="tenantId"/> | ||||
| @@ -83,5 +83,12 @@ | |||||
| <include refid="dynamicWhereConditions"/> | <include refid="dynamicWhereConditions"/> | ||||
| </select> | </select> | ||||
| <update id="updateBatch" parameterType="com.iformall.domain.po.KwMeter" > | |||||
| update kw_meter set online_status = #{onlineStatus}, update_time = #{updateTime} | |||||
| where id in | |||||
| <foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | |||||
| #{idItem} | |||||
| </foreach> | |||||
| </update> | |||||
| </mapper> | </mapper> | ||||