Browse Source

[电表][修改]:在线状态更新和数据插入优化

release_toaliyun_real
hupeng 6 years ago
parent
commit
fcbd05ea1d
12 changed files with 179 additions and 64 deletions
  1. +2
    -0
      mallinkCallback/src/main/java/com/iformall/controller/device/KwBoxV1Controller.java
  2. +34
    -0
      mallinkService/src/main/java/com/iformall/enums/EnumBoxOnlineStatus.java
  3. +34
    -0
      mallinkService/src/main/java/com/iformall/enums/EnumMeterOnlineStatus.java
  4. +2
    -0
      mallinkService/src/main/java/com/iformall/mapper/KwMeterDataMapper.java
  5. +1
    -2
      mallinkService/src/main/java/com/iformall/service/kw/KwBoxService.java
  6. +2
    -0
      mallinkService/src/main/java/com/iformall/service/kw/KwMeterDataService.java
  7. +6
    -1
      mallinkService/src/main/java/com/iformall/service/kw/KwMeterService.java
  8. +56
    -60
      mallinkService/src/main/java/com/iformall/service/kw/impl/KwBoxServiceImpl.java
  9. +5
    -0
      mallinkService/src/main/java/com/iformall/service/kw/impl/KwMeterDataServiceImpl.java
  10. +6
    -0
      mallinkService/src/main/java/com/iformall/service/kw/impl/KwMeterServiceImpl.java
  11. +24
    -1
      mallinkService/src/main/resources/mapper/KwMeterDataMapper.xml
  12. +7
    -0
      mallinkService/src/main/resources/mapper/KwMeterMapper.xml

+ 2
- 0
mallinkCallback/src/main/java/com/iformall/controller/device/KwBoxV1Controller.java View File

@@ -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();


+ 34
- 0
mallinkService/src/main/java/com/iformall/enums/EnumBoxOnlineStatus.java View File

@@ -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;
}
}

+ 34
- 0
mallinkService/src/main/java/com/iformall/enums/EnumMeterOnlineStatus.java View File

@@ -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;
}
}

+ 2
- 0
mallinkService/src/main/java/com/iformall/mapper/KwMeterDataMapper.java View File

@@ -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);


+ 1
- 2
mallinkService/src/main/java/com/iformall/service/kw/KwBoxService.java View File

@@ -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);
} }

+ 2
- 0
mallinkService/src/main/java/com/iformall/service/kw/KwMeterDataService.java View File

@@ -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);

+ 6
- 1
mallinkService/src/main/java/com/iformall/service/kw/KwMeterService.java View File

@@ -38,7 +38,12 @@ public interface KwMeterService {
*/ */
ResultData saveOrUpdate(KwMeter record); ResultData saveOrUpdate(KwMeter record);



/**
* 保存或更新实体
*
* @param record
*/
ResultData updateBatch(KwMeter record);
/** /**
* 根据Id删除实体 * 根据Id删除实体
* *


+ 56
- 60
mallinkService/src/main/java/com/iformall/service/kw/impl/KwBoxServiceImpl.java View File

@@ -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);
}
} }

+ 5
- 0
mallinkService/src/main/java/com/iformall/service/kw/impl/KwMeterDataServiceImpl.java View File

@@ -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)
{ {


+ 6
- 0
mallinkService/src/main/java/com/iformall/service/kw/impl/KwMeterServiceImpl.java View File

@@ -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) {


+ 24
- 1
mallinkService/src/main/resources/mapper/KwMeterDataMapper.xml View File

@@ -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"/>


+ 7
- 0
mallinkService/src/main/resources/mapper/KwMeterMapper.xml View File

@@ -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>

Loading…
Cancel
Save