物联设备BUG处理

This commit is contained in:
曹磊 2026-04-15 18:00:18 +08:00
parent 19073460b1
commit 4523d38c0e
19 changed files with 287 additions and 16 deletions

View File

@ -23,6 +23,7 @@ public class DeviceBindLog implements Serializable {
private String nuId;
private String nuName;
private String dimension;
private String deviceName;
@Dict(dicCode = "tplink_device_type")
private String deviceType;
private String deviceModel;

View File

@ -49,4 +49,6 @@ public interface DeviceManagerMapper extends BaseMapper<DeviceManager> {
IPage<DeviceIntegration> findHumidPage(Page<DeviceIntegration> page, @Param("params") DeviceIntegration deviceIntegration);
IPage<DeviceBindLog> findBingLogPage(Page<DeviceBindLog> page, @Param("params") DeviceBindLog deviceBindLog);
void addBindPreview(DeviceBindLog deviceBindLog);
void addDeviceReleaseLog(String orgCode,String nuId);
void releaseNu(String orgCode,String nuId);
}

View File

@ -512,6 +512,7 @@
nu_id,
nu_name,
dimension,
device_name,
device_type,
device_model,
sn,
@ -520,6 +521,15 @@
opt_type
from nu_iot_device_bind_log
where org_code = #{params.orgCode}
<if test="params.dimension != null and params.dimension != ''">
AND dimension = #{params.dimension}
</if>
<if test="params.deviceType != null and params.deviceType != ''">
AND device_type = #{params.deviceType}
</if>
<if test="params.deviceName != null and params.deviceName != ''">
AND device_name LIKE concat('%',#{params.deviceName},'%')
</if>
order by org_code asc ,factory asc ,device_type asc ,device_model asc ,sn asc,opt_date desc
</select>
@ -529,6 +539,7 @@
nu_id,
nu_name,
dimension,
device_name,
device_type,
device_model,
sn,
@ -541,6 +552,7 @@
#{nuId},
#{nuName},
#{dimension},
#{deviceName},
#{deviceType},
#{deviceModel},
#{sn},
@ -551,4 +563,41 @@
)
</insert>
<insert id="addDeviceReleaseLog">
insert into nu_iot_device_bind_log(
org_code,
sn,
dimension,
device_name,
device_type,
device_model,
factory,
opt_date,
opt_type,
remarks
)
select
#{orgCode},
sn,
dimension,
device_name,
device_type,
device_model,
factory,
now(),
'释放',
'区域停用'
from nu_iot_device_preview a
where a.org_code = #{orgCode}
and a.nu_id = #{nuId}
and ifnull(a.device_status,'') != '损坏'
</insert>
<update id="releaseNu">
update nu_iot_device_preview
set nu_id = null
where org_code = #{orgCode}
and nu_id = #{nuId}
</update>
</mapper>

View File

@ -45,4 +45,6 @@ public interface IDeviceManagerService extends IService<DeviceManager> {
Result<String> pullHumid(DeviceIntegration deviceIntegration);
IPage<DeviceBindLog> findBingLogPage(Page<DeviceBindLog> page, DeviceBindLog deviceBindLog);
void addBindPreview(DeviceBindLog deviceBindLog);
void releaseNu(String orgCode,String nuId);
}

View File

@ -307,6 +307,7 @@ public class DeviceManagerServiceImpl extends ServiceImpl<DeviceManagerMapper, D
tqDeviceInfo.setCid(deviceIntegration.getSn());
String errorMsg = tqDeviceInfoService.addCollector(tqDeviceInfo);
if(!errorMsg.equals("")){
tqDeviceInfoService.deleteCollector(tqDeviceInfo);
return Result.error(errorMsg);
}
WaterMeter waterMeter = new WaterMeter();
@ -314,14 +315,26 @@ public class DeviceManagerServiceImpl extends ServiceImpl<DeviceManagerMapper, D
waterMeter.setAddress(deviceIntegration.getSn());
errorMsg = waterMeterService.addWater(waterMeter);
if(!errorMsg.equals("")){
waterMeterService.deleteWater(waterMeter);
return Result.error(errorMsg);
}
//先抄表并设置opr_id在抄表时判断opr_id是否是集成并且如果是离线时显示集成失败并删除采集器和表
// 1判断抄表同步返回状态
// 2或在异步中判断opr_id进行推送
// waterMeter.setOprId("集成");
Result<String> res = waterMeterService.waterRead(waterMeter);
if(!res.isSuccess()){
tqDeviceInfoService.deleteCollector(tqDeviceInfo);
waterMeterService.deleteWater(waterMeter);
return res;
}
tqDeviceInfoService.getAllMeter(true);
tqDeviceInfoService.getAllCollector(true);
syncBizService.syncDevice(deviceIntegration.getOrgCode(),deviceIntegration.getSn());
deviceIntegration.setDeviceStatus("正常");
baseMapper.editPreviewStatusBySn(deviceIntegration);
return Result.OK("拉取水表成功!");
// return Result.OK("需等待一分钟之后刷新!");
}
@Override
@ -381,6 +394,12 @@ public class DeviceManagerServiceImpl extends ServiceImpl<DeviceManagerMapper, D
return logId;
}
@Override
public void releaseNu(String orgCode,String nuId){
baseMapper.addDeviceReleaseLog(orgCode,nuId);// 记录设备释放日志
baseMapper.releaseNu(orgCode,nuId);// 更新湿度计
}
public String formatMacAddress(String mac) {
if (mac == null || mac.length() != 12) {
throw new IllegalArgumentException("MAC地址必须为12位十六进制字符");

View File

@ -308,7 +308,7 @@ public class CameraInfoServiceImpl extends ServiceImpl<CameraInfoMapper, CameraI
JSONObject jsonObject = new JSONObject(jsonResponse);
String errorCode = jsonObject.getStr("error_code");
if(errorCode.equals("0")){
syncProjectIpc(jsonResponse);
errMsg = syncProjectIpc(jsonResponse);
}else{
try{
ErrorCode errVo = errorCodeService.getByCode(errorCode);
@ -432,7 +432,8 @@ public class CameraInfoServiceImpl extends ServiceImpl<CameraInfoMapper, CameraI
* @param jsonResponse
* @return
*/
private void syncProjectIpc(String jsonResponse){
private String syncProjectIpc(String jsonResponse){
String errMsg = "";
JSONObject jsonObject = new JSONObject(jsonResponse);
if(jsonObject.getInt("error_code").equals(0)){
JSONObject result = (JSONObject)jsonObject.get("result");
@ -478,8 +479,11 @@ public class CameraInfoServiceImpl extends ServiceImpl<CameraInfoMapper, CameraI
e.printStackTrace();
}
}
}else{
errMsg = "拉取设备为空,请检查参数!";
}
}
return errMsg;
}
/**

View File

@ -12,6 +12,7 @@ import com.nu.modules.tq.common.entity.TqDeviceInfo;
public interface ITqDeviceInfoService extends IService<TqDeviceInfo> {
TqDeviceInfo getByCid(String cid);
String addCollector(TqDeviceInfo tqDeviceInfo);
String deleteCollector(TqDeviceInfo tqDeviceInfo);
void getAllMeter(boolean isJob);
void getAllCollector(boolean isJob);
}

View File

@ -118,6 +118,71 @@ public class TqDeviceInfoServiceImpl extends ServiceImpl<TqDeviceInfoMapper, TqD
return errorMsg;
}
/**
* 注销采集器
* @return
*/
@Override
public String deleteCollector(TqDeviceInfo tqDeviceInfo){
String errorMsg = "";
List<Map<String, Object>> req = new ArrayList<>();
Map<String, Object> item = new HashMap<>();
item.put("cid", tqDeviceInfo.getCid());
req.add(item);
String responseStr = tqApi.deleteCollector(req);
JSONObject jsonObject = new JSONObject(responseStr);
String httpStatus = jsonObject.getStr("status");
if(httpStatus.equals("SUCCESS")){
String response_content = jsonObject.getStr("response_content");
JSONArray jsonArray = new JSONArray(response_content);
for(int i=0;i<jsonArray.size();i++){
JSONObject json = (JSONObject)jsonArray.get(i);
String status = json.getStr("status");//状态
String cid = json.getStr("cid");//CID
if(status.equals("SUCCESS")){
TqApiLog tqApiLog = new TqApiLog();
tqApiLog.setOprId(cid);
tqApiLog.setCid(cid);
tqApiLog.setRequestTime(DateUtil.now());
tqApiLog.setRequestStatus("删除采集器成功");
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
if (sysUser != null) {
tqApiLog.setOptBy(sysUser.getRealname());
}
logService.insert(tqApiLog);
baseMapper.deleteByCid(cid);
}else{
errorMsg += json.getStr("error_msg");
TqApiLog tqApiLog = new TqApiLog();
tqApiLog.setOprId(cid);
tqApiLog.setCid(cid);
tqApiLog.setRequestTime(DateUtil.now());
tqApiLog.setRequestStatus("删除采集器失败");
tqApiLog.setRequestRemark(errorMsg);
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
if (sysUser != null) {
tqApiLog.setOptBy(sysUser.getRealname());
}
logService.insert(tqApiLog);
}
}
}else{
errorMsg = jsonObject.getStr("error_msg");
TqApiLog tqApiLog = new TqApiLog();
tqApiLog.setOprId(tqDeviceInfo.getCid());
tqApiLog.setCid(tqDeviceInfo.getCid());
tqApiLog.setRequestTime(DateUtil.now());
tqApiLog.setRequestStatus("删除采集器失败");
tqApiLog.setRequestRemark(errorMsg);
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
if (sysUser != null) {
tqApiLog.setOptBy(sysUser.getRealname());
}
logService.insert(tqApiLog);
}
return errorMsg;
}
/**
* 获取设备信息
* @return

View File

@ -13,7 +13,9 @@ public enum TqApiEnum {
METER_INFO("/Api/Meter","查询设备列表和当前状态"),
COLLECTOR_INFO("/Api/Collector","查询采集器列表和当前状态"),
ADD_COLLECTOR("/Api_v2/collector/add","注册采集器"),
ADD_WATER_METER("/Api_v2/water_meter/add","水表添加"),
ADD_WATER_METER("/Api_v2/water_meter/add","添加水表"),
DELETE_WATER_METER("/Api_v2/water_meter/delete","删除水表"),
DELETE_COLLECTOR("/Api_v2/collector/delete","注销采集器"),
ELE_RESET("/Api_v2/ele_security/reset","电表清零"),
WATER_RESET("/Api_v2/water_security/reset","水表清零"),
ELE_CONTROL("/Api_v2/ele_control","电表开关闸"),

View File

@ -89,6 +89,32 @@ public class TqApi {
return responseStr;
}
/**
* 删除电表
*/
public String deleteWaterMeters(List<Map<String, Object>> req){
this.initTqConfig();
String request_content = JSON.toJSONString(req);
log.info("deleteWaterMeters:request:{}",request_content);
String url = tqConfig.getRequestUrl()+TqApiEnum.DELETE_WATER_METER.getValue();
String responseStr = requestAsync(url,request_content,"");
log.info("deleteWaterMeters:response:{}",responseStr);
return responseStr;
}
/**
* 删除采集器
*/
public String deleteCollector(List<Map<String, Object>> req){
this.initTqConfig();
String request_content = JSON.toJSONString(req);
log.info("deleteCollector:request:{}",request_content);
String url = tqConfig.getRequestUrl()+TqApiEnum.DELETE_COLLECTOR.getValue();
String responseStr = requestAsync(url,request_content,"");
log.info("deleteCollector:response:{}",responseStr);
return responseStr;
}
/**
* 电表清零
*/

View File

@ -119,5 +119,7 @@ public class WaterMeter implements Serializable {
private String createTime;//时间
@TableField(exist = false)
private List<WaterMeter> seedList;//子列表
@TableField(exist = false)
private String oprId;//抄表传递参数
}

View File

@ -18,6 +18,7 @@ public interface WaterMeterMapper extends BaseMapper<WaterMeter> {
int insertWater(WaterMeter waterMeter);
int updateWater(WaterMeter waterMeter);
int deleteWater(WaterMeter waterMeter);
void updateDepartById(WaterMeter waterInfo);

View File

@ -149,6 +149,10 @@
</where>
</update>
<delete id="deleteWater" parameterType="com.nu.modules.tq.water.entity.WaterMeter">
delete from nu_iot_tq_water_meter where cid = #{cid} and address = #{address}
</delete>
<update id="updateValue" parameterType="com.nu.modules.tq.water.entity.WaterMeter">
update nu_iot_tq_water_meter
set

View File

@ -15,6 +15,7 @@ public interface IWaterMeterService extends IService<WaterMeter> {
void updateValue(WaterMeter waterMeter);
void updateRelayState(WaterMeter waterMeter);
String addWater(WaterMeter waterMeter);
String deleteWater(WaterMeter waterMeter);
Result<String> waterReset(WaterMeter waterMeter);
Result<String> waterControl(WaterMeter waterMeter);
Result<String> waterRead(WaterMeter waterMeter);

View File

@ -160,6 +160,78 @@ public class WaterMeterServiceImpl extends ServiceImpl<WaterMeterMapper, WaterMe
return errorMsg;
}
/**
* 删除水表
*/
@Override
public String deleteWater(WaterMeter waterMeter){
String errorMsg = "";
List<Map<String, Object>> req = new ArrayList<>();
Map<String, Object> item = new HashMap<>();
item.put("cid", waterMeter.getCid());
item.put("address", waterMeter.getAddress());
// item.put("model", "NS-无线无预付费水表");//没有指定默认为系统后台配置的默认水表类型
req.add(item);
String responseStr = tqApi.deleteWaterMeters(req);
JSONObject jsonObject = new JSONObject(responseStr);
String httpStatus = jsonObject.getStr("status");
if(httpStatus.equals("SUCCESS")){
String response_content = jsonObject.getStr("response_content");
JSONArray jsonArray = new JSONArray(response_content);
for(int i=0;i<jsonArray.size();i++){
JSONObject json = (JSONObject)jsonArray.get(i);
String status = json.getStr("status");//状态
String cid = json.getStr("cid");//CID
String address = json.getStr("address");//address
if(status.equals("SUCCESS")){
TqApiLog tqApiLog = new TqApiLog();
tqApiLog.setOprId(cid);
tqApiLog.setCid(cid);
tqApiLog.setAddress(address);
tqApiLog.setRequestTime(DateUtil.now());
tqApiLog.setRequestStatus("删除水表成功");
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
if (sysUser != null) {
tqApiLog.setOptBy(sysUser.getRealname());
}
logService.insert(tqApiLog);
WaterMeter entity = new WaterMeter();
entity.setCid(cid);
entity.setAddress(address);
baseMapper.deleteWater(entity);
}else{
errorMsg += json.getStr("error_msg");
TqApiLog tqApiLog = new TqApiLog();
tqApiLog.setOprId(cid);
tqApiLog.setCid(cid);
tqApiLog.setAddress(address);
tqApiLog.setRequestTime(DateUtil.now());
tqApiLog.setRequestStatus("删除水表失败");
tqApiLog.setRequestRemark(errorMsg);
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
if (sysUser != null) {
tqApiLog.setOptBy(sysUser.getRealname());
}
logService.insert(tqApiLog);
}
}
}else{
errorMsg = jsonObject.getStr("error_msg");
TqApiLog tqApiLog = new TqApiLog();
tqApiLog.setCid(waterMeter.getCid());
tqApiLog.setAddress(waterMeter.getAddress());
tqApiLog.setRequestTime(DateUtil.now());
tqApiLog.setRequestStatus("删除水表失败");
tqApiLog.setRequestRemark(errorMsg);
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
if (sysUser != null) {
tqApiLog.setOptBy(sysUser.getRealname());
}
logService.insert(tqApiLog);
}
return errorMsg;
}
/**
* 清零
*/
@ -365,9 +437,13 @@ public class WaterMeterServiceImpl extends ServiceImpl<WaterMeterMapper, WaterMe
if(entity == null){
return Result.error("请先同步水表设备信息后再进行抄表");
}
String oprId = waterMeter.getOprId();
if(oprId==null||oprId.equals("")){
oprId = HttpTool.generateOperateId();
}
List<Map<String, Object>> req = new ArrayList<>();
Map<String, Object> item = new HashMap<>();
item.put("opr_id", HttpTool.generateOperateId());
item.put("opr_id", oprId);
item.put("time_out", 0);
item.put("must_online", true);
item.put("retry_times", 1);
@ -384,10 +460,10 @@ public class WaterMeterServiceImpl extends ServiceImpl<WaterMeterMapper, WaterMe
for(int i=0;i<jsonArray.size();i++){
JSONObject json = (JSONObject)jsonArray.get(i);
String status = json.getStr("status");//状态
String oprId = json.getStr("opr_id");//操作ID
String resOprId = json.getStr("opr_id");//操作ID
if(status.equals("SUCCESS")){
TqApiLog tqApiLog = new TqApiLog();
tqApiLog.setOprId(oprId);
tqApiLog.setOprId(resOprId);
tqApiLog.setCid(waterMeter.getCid());
tqApiLog.setAddress(waterMeter.getAddress());
tqApiLog.setType(42);
@ -402,7 +478,7 @@ public class WaterMeterServiceImpl extends ServiceImpl<WaterMeterMapper, WaterMe
}else{
String errorMsg = json.getStr("error_msg");
TqApiLog tqApiLog = new TqApiLog();
tqApiLog.setOprId(oprId);
tqApiLog.setOprId(resOprId);
tqApiLog.setCid(waterMeter.getCid());
tqApiLog.setAddress(waterMeter.getAddress());
tqApiLog.setType(42);

View File

@ -15,6 +15,7 @@ public interface HumidDeviceMapper extends BaseMapper<HumidDevice> {
int insertDevice(HumidDevice humidDevice);
int updateDevice(HumidDevice humidDevice);
int delFlagDevice(HumidDevice humidDevice);
int delDevice(HumidDevice humidDevice);
int updateValue(HumidDevice humidDevice);
int insertLog(HumidDevice humidDevice);
IPage<HumidDevice> findLogPage(Page<HumidDevice> page, @Param("params") HumidDevice humidDevice);

View File

@ -164,6 +164,10 @@
update nu_iot_yiweilian_humid_device set del_flag = #{delFlag} where sn = #{sn}
</update>
<delete id="delDevice" parameterType="com.nu.modules.yiweilian.humid.entity.HumidDevice">
delete from nu_iot_yiweilian_humid_device where sn = #{sn}
</delete>
<update id="updateValue" parameterType="com.nu.modules.yiweilian.humid.entity.HumidDevice">
update nu_iot_yiweilian_humid_device
set

View File

@ -88,7 +88,7 @@ public class HumidDeviceServiceImpl extends ServiceImpl<HumidDeviceMapper, Humid
}
String error2 = updateDeviceRealTime(humidDevice);
if (!error2.equals("")) {
String result = "设备添加成功,但是获取实时数据错误" + error2;
String result = "设备添加失败" + error2;
return Result.error(result);
}
return Result.OK("添加成功");
@ -263,14 +263,23 @@ public class HumidDeviceServiceImpl extends ServiceImpl<HumidDeviceMapper, Humid
String humidity = json.getStr("humidity");
String reportingTime = json.getStr("date");
dh.setStatus(status);
dh.setSn(sn);
Date reportingDate = DateUtil.parse(reportingTime, "yyyy-MM-dd HH:mm:ss");
Calendar ca = Calendar.getInstance();
ca.add(Calendar.MINUTE, -5);
Date currentDate = ca.getTime();
if (reportingDate.getTime() <= currentDate.getTime()) {
dh.setStatus("1");
if(status.equals("2")){
baseMapper.delDevice(dh);
Map<String, Object> params = new HashMap<>();
params.put("sn", sn);
yiweilianApi.deleteDevice(params);
return "设备不存在!";
}
if(status.equals("0")){
if (reportingDate.getTime() <= currentDate.getTime()) {
dh.setStatus("1");
}
}
dh.setSn(sn);
dh.setElectricity(electricity);
dh.setTemperature(temperature);
dh.setHumidity(humidity);

View File

@ -5,6 +5,7 @@ import com.nu.dto.IotNuBaseInfoMQDto;
import com.nu.dto.StatusListMQDto;
import com.nu.dto.StatusMQDto;
import com.nu.modules.device.manager.entity.DeviceBindLog;
import com.nu.modules.device.manager.entity.DeviceManager;
import com.nu.modules.device.manager.entity.DevicePreview;
import com.nu.modules.device.manager.service.IDeviceManagerService;
import com.nu.modules.dingshuo.electricity.entity.DsElectricityMeter;
@ -158,11 +159,12 @@ public class IotDeviceMQListener {
public void releaseNuDevices(IotNuBaseInfoMQDto dto) {
String orgCode = dto.getOrgCode();
String nuId = dto.getNuId();
IotDeviceInfo idi = new IotDeviceInfo();
idi.setNuId(nuId);
idi.setOrgCode(orgCode);
idi.setRemarks("业务平台区域停用");
iotDeviceInfoService.releaseNu(idi);
// IotDeviceInfo idi = new IotDeviceInfo();
// idi.setNuId(nuId);
// idi.setOrgCode(orgCode);
// idi.setRemarks("业务平台区域停用");
// iotDeviceInfoService.releaseNu(idi);
deviceManagerService.releaseNu(orgCode,nuId);
}
@RabbitListener(