mqtt架构重构

feasure
lld 2026-01-22 18:20:12 +08:00
parent 658006e14a
commit 17f8af0901
13 changed files with 890 additions and 9 deletions

View File

@ -6,10 +6,10 @@ spring:
password: Admin#12345678 # Mosquitto密码
client-id: springboot-backend # 截取UUID前8位自动去横线
default-topic: dtu/+/up,frontend/+/control/+,frontend/+/online # 后端监听的主题
qos: 1 # 消息可靠性
qos: 0 # 消息可靠性
timeout: 60 # 连接超时
keep-alive: 60 # 心跳间隔
latest-ttl-seconds: 120 #设备最新状态缓存的过期时间(秒)。
# 自动关闭任务线程池大小
auto-off-thread-pool-size: 5
sub-ttl-seconds: 3600 # 在线新跳ttl
subc-ttl-seconds: 3600 # 在线新跳ttl

View File

@ -125,7 +125,7 @@ public class MqttConfig {
connectOptions.setCleanSession(false);
// 开启自动重连连接断开后自动尝试重连提升稳定性方案A核心
connectOptions.setAutomaticReconnect(true);
connectOptions.setAutomaticReconnect(false);
// 设置最大重连间隔(秒):避免频繁重连消耗资源
connectOptions.setMaxReconnectDelay(30);
return connectOptions;

View File

@ -181,7 +181,7 @@ public class MqttMessageHandler implements SmartLifecycle {
int[] qosArray = new int[topics.length];
// 按主题类型设置QoS控制指令/状态用QoS 1
for (int i = 0; i < topics.length; i++) {
qosArray[i] = 1;
qosArray[i] = 0;
topics[i] = topics[i].trim();
}
@ -289,6 +289,7 @@ public class MqttMessageHandler implements SmartLifecycle {
return;
}
// log.info("【设备处理】JSON解析{}",payloadObj);
// 解析设备ID主题格式为dtu/{deviceId}/up分割后第2个元素是设备ID
String deviceId = topic.split("/")[1];
@ -394,7 +395,7 @@ public class MqttMessageHandler implements SmartLifecycle {
String frontendTopic = "frontend/" + clientId + "/dtu/" + deviceId + "/listener";
// 发布消息
mqttMessageSender.publish(frontendTopic, payload);
// log.info("【设备状态转发】设备{} → 前端{},主题:{}", deviceId, clientId, frontendTopic);
log.info("【设备状态转发】设备{} → 前端{},主题:{}", deviceId, clientId, frontendTopic);
}
// 删掉设备对应的客户端
if (stale != null && !stale.isEmpty()) {
@ -575,7 +576,7 @@ public class MqttMessageHandler implements SmartLifecycle {
String deviceTopic = "dtu/" + deviceId + "/down";
//todo
// mqttMessageSender.publish(deviceTopic, down.toJSONString());
mqttMessageSender.publish(deviceTopic, down.toJSONString());
log.info("【自动关任务】检测仍在运行已下发关闭deviceId={}, funcType={}, payload={}", deviceId, funcType, down.toJSONString());
} else {
log.info("【自动关任务】检测未运行或状态未知跳过关闭deviceId={}, funcType={}, current={}", deviceId, funcType, current);
@ -644,7 +645,7 @@ public class MqttMessageHandler implements SmartLifecycle {
// 4. 转发指令到设备
String deviceTopic = "dtu/" + deviceId + "/down";
//todo
// mqttMessageSender.publish(deviceTopic, payload);
mqttMessageSender.publish(deviceTopic, payload);
log.info("【指令转发】前端{} → 设备{}的{}功能", clientId, deviceId, funcType);
}
@ -667,7 +668,7 @@ public class MqttMessageHandler implements SmartLifecycle {
stringRedisTemplate.expire("subc:" + clientId, subcTtlSeconds, TimeUnit.SECONDS);
// todo 生产环境不建议打印每次心跳
log.debug("【在线心跳】clientId={} 续期subcTTL={}s payload={}", clientId, subcTtlSeconds, payload);
// log.debug("【在线心跳】clientId={} 续期subcTTL={}s payload={}", clientId, subcTtlSeconds, payload);
} catch (Exception e) {
log.warn("【在线心跳】处理失败 topic={} msg={}", topic, e.getMessage());
}

View File

@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.annotation.TableName;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.baomidou.mybatisplus.annotation.TableField;
#if($column.javaField == 'version')
import com.baomidou.mybatisplus.annotation.Version;
#end
import com.baomidou.mybatisplus.annotation.TableName;
import com.agri.common.annotation.Excel;
#if($table.crud || $table.sub)

View File

@ -7,7 +7,7 @@ import com.agri.common.utils.DateUtils;
#break
#end
#end
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
#if($table.sub)
import java.util.ArrayList;

View File

@ -22,6 +22,11 @@
<groupId>com.agri</groupId>
<artifactId>agri-common</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>

View File

@ -0,0 +1,114 @@
package com.agri.system.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.ibatis.ognl.ObjectElementsAccessor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.agri.common.annotation.Log;
import com.agri.common.core.controller.BaseController;
import com.agri.common.core.domain.AjaxResult;
import com.agri.common.enums.BusinessType;
import com.agri.system.domain.SysDtuRemark;
import com.agri.system.service.ISysDtuRemarkService;
import com.agri.common.utils.poi.ExcelUtil;
import com.agri.common.core.page.TableDataInfo;
/**
* dtuController
*
* @author lld
* @date 2026-01-21
*/
@RestController
@RequestMapping("/assets/remark")
public class SysDtuRemarkController extends BaseController
{
@Autowired
private ISysDtuRemarkService sysDtuRemarkService;
/**
* dtu
*/
@PreAuthorize("@ss.hasPermi('assets:remark:list')")
@GetMapping("/list")
public TableDataInfo list(SysDtuRemark sysDtuRemark)
{
startPage();
List<SysDtuRemark> list = sysDtuRemarkService.selectSysDtuRemarkList(sysDtuRemark);
return getDataTable(list);
}
/**
* dtu
*/
@PreAuthorize("@ss.hasPermi('assets:remark:export')")
@Log(title = "dtu设备备注", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, SysDtuRemark sysDtuRemark)
{
List<SysDtuRemark> list = sysDtuRemarkService.selectSysDtuRemarkList(sysDtuRemark);
ExcelUtil<SysDtuRemark> util = new ExcelUtil<SysDtuRemark>(SysDtuRemark.class);
util.exportExcel(response, list, "dtu设备备注数据");
}
/**
* dtu
*/
@PreAuthorize("@ss.hasPermi('assets:remark:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(sysDtuRemarkService.selectSysDtuRemarkById(id));
}
/**
* dtu
*/
@PreAuthorize("@ss.hasPermi('assets:remark:add')")
@Log(title = "dtu设备备注", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SysDtuRemark sysDtuRemark)
{
return toAjax(sysDtuRemarkService.insertSysDtuRemark(sysDtuRemark));
}
/**
* dtu
*/
@PreAuthorize("@ss.hasPermi('assets:remark:edit')")
@Log(title = "dtu设备备注", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SysDtuRemark sysDtuRemark)
{
return toAjax(sysDtuRemarkService.updateSysDtuRemark(sysDtuRemark));
}
/**
* dtu
*/
@PreAuthorize("@ss.hasPermi('assets:remark:remove')")
@Log(title = "dtu设备备注", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(sysDtuRemarkService.deleteSysDtuRemarkByIds(ids));
}
/**
* dtu
*/
@PreAuthorize("@ss.hasPermi('assets:remark:query')")
@GetMapping(value = "/getDtuByImei")
public AjaxResult getDtuByImei(@RequestParam("imei") String imei)
{
SysDtuRemark sysDtuRemark = sysDtuRemarkService.lambdaQuery().eq(SysDtuRemark::getImei, imei).one();
return success(sysDtuRemark);
}
}

View File

@ -0,0 +1,332 @@
package com.agri.system.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.agri.common.annotation.Excel;
import com.agri.common.core.domain.BaseEntity;
/**
* dtu sys_dtu_remark
*
* @author lld
* @date 2026-01-21
*/
@TableName("sys_dtu_remark")
public class SysDtuRemark extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
/** 主键ID */
private Long id;
/** 设备唯一标识(IMEI/DeviceId) */
@Excel(name = "设备唯一标识(IMEI/DeviceId)")
private String imei;
/** 卷被开 */
@Excel(name = "卷被开")
private String jbk;
/** 卷被关 */
@Excel(name = "卷被关")
private String jbg;
/** 卷膜1开 */
@Excel(name = "卷膜1开")
private String jm1k;
/** 卷膜1关 */
@Excel(name = "卷膜1关")
private String jm1g;
/** 卷膜2开 */
@Excel(name = "卷膜2开")
private String jm2k;
/** 卷膜2关 */
@Excel(name = "卷膜2关")
private String jm2g;
/** 卷膜3开 */
@Excel(name = "卷膜3开")
private String jm3k;
/** 卷膜3关 */
@Excel(name = "卷膜3关")
private String jm3g;
/** 温度1(℃) */
@Excel(name = "温度1(℃)")
private String temp1;
/** 湿度1(%RH) */
@Excel(name = "湿度1(%RH)")
private String humi1;
/** 温度2(℃) */
@Excel(name = "温度2(℃)")
private String temp2;
/** 湿度2(%RH) */
@Excel(name = "湿度2(%RH)")
private String humi2;
/** 温度3(℃) */
@Excel(name = "温度3(℃)")
private String temp3;
/** 湿度3(%RH) */
@Excel(name = "湿度3(%RH)")
private String humi3;
/** 温度4(℃) */
@Excel(name = "温度4(℃)")
private String temp4;
/** 湿度4(%RH) */
@Excel(name = "湿度4(%RH)")
private String humi4;
/** 数据版本号(乐观锁) */
@Excel(name = "数据版本号", readConverterExp = "乐=观锁")
@Version
private String version;
/** 扩展备注JSON格式存储临时/自定义配置) */
private String extJson;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setImei(String imei)
{
this.imei = imei;
}
public String getImei()
{
return imei;
}
public void setJbk(String jbk)
{
this.jbk = jbk;
}
public String getJbk()
{
return jbk;
}
public void setJbg(String jbg)
{
this.jbg = jbg;
}
public String getJbg()
{
return jbg;
}
public void setJm1k(String jm1k)
{
this.jm1k = jm1k;
}
public String getJm1k()
{
return jm1k;
}
public void setJm1g(String jm1g)
{
this.jm1g = jm1g;
}
public String getJm1g()
{
return jm1g;
}
public void setJm2k(String jm2k)
{
this.jm2k = jm2k;
}
public String getJm2k()
{
return jm2k;
}
public void setJm2g(String jm2g)
{
this.jm2g = jm2g;
}
public String getJm2g()
{
return jm2g;
}
public void setJm3k(String jm3k)
{
this.jm3k = jm3k;
}
public String getJm3k()
{
return jm3k;
}
public void setJm3g(String jm3g)
{
this.jm3g = jm3g;
}
public String getJm3g()
{
return jm3g;
}
public void setTemp1(String temp1)
{
this.temp1 = temp1;
}
public String getTemp1()
{
return temp1;
}
public void setHumi1(String humi1)
{
this.humi1 = humi1;
}
public String getHumi1()
{
return humi1;
}
public void setTemp2(String temp2)
{
this.temp2 = temp2;
}
public String getTemp2()
{
return temp2;
}
public void setHumi2(String humi2)
{
this.humi2 = humi2;
}
public String getHumi2()
{
return humi2;
}
public void setTemp3(String temp3)
{
this.temp3 = temp3;
}
public String getTemp3()
{
return temp3;
}
public void setHumi3(String humi3)
{
this.humi3 = humi3;
}
public String getHumi3()
{
return humi3;
}
public void setTemp4(String temp4)
{
this.temp4 = temp4;
}
public String getTemp4()
{
return temp4;
}
public void setHumi4(String humi4)
{
this.humi4 = humi4;
}
public String getHumi4()
{
return humi4;
}
public void setVersion(String version)
{
this.version = version;
}
public String getVersion()
{
return version;
}
public void setExtJson(String extJson)
{
this.extJson = extJson;
}
public String getExtJson()
{
return extJson;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("imei", getImei())
.append("jbk", getJbk())
.append("jbg", getJbg())
.append("jm1k", getJm1k())
.append("jm1g", getJm1g())
.append("jm2k", getJm2k())
.append("jm2g", getJm2g())
.append("jm3k", getJm3k())
.append("jm3g", getJm3g())
.append("temp1", getTemp1())
.append("humi1", getHumi1())
.append("temp2", getTemp2())
.append("humi2", getHumi2())
.append("temp3", getTemp3())
.append("humi3", getHumi3())
.append("temp4", getTemp4())
.append("humi4", getHumi4())
.append("version", getVersion())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("extJson", getExtJson())
.toString();
}
}

View File

@ -0,0 +1,65 @@
package com.agri.system.domain.vo;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;
@Data
public class DtuSettingVo {
/** 设备唯一标识(IMEI/DeviceId) */
private String imei;
/** 卷被开 */
private String jbk;
/** 卷被关 */
private String jbg;
/** 卷膜1开 */
private String jm1k;
/** 卷膜1关 */
private String jm1g;
/** 卷膜2开 */
private String jm2k;
/** 卷膜2关 */
private String jm2g;
/** 卷膜3开 */
private String jm3k;
/** 卷膜3关 */
private String jm3g;
/** 温度1(℃) */
private String temp1;
/** 湿度1(%RH) */
private String humi1;
/** 温度2(℃) */
private String temp2;
/** 湿度2(%RH) */
private String humi2;
/** 温度3(℃) */
private String temp3;
/** 湿度3(%RH) */
private String humi3;
/** 温度4(℃) */
private String temp4;
/** 湿度4(%RH) */
private String humi4;
/** 数据版本号(乐观锁) */
private String version;
/** 扩展备注JSON格式存储临时/自定义配置) */
private String extJson;
}

View File

@ -0,0 +1,62 @@
package com.agri.system.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.agri.system.domain.SysDtuRemark;
/**
* dtuMapper
*
* @author lld
* @date 2026-01-21
*/
public interface SysDtuRemarkMapper extends BaseMapper<SysDtuRemark>
{
/**
* dtu
*
* @param id dtu
* @return dtu
*/
public SysDtuRemark selectSysDtuRemarkById(Long id);
/**
* dtu
*
* @param sysDtuRemark dtu
* @return dtu
*/
public List<SysDtuRemark> selectSysDtuRemarkList(SysDtuRemark sysDtuRemark);
/**
* dtu
*
* @param sysDtuRemark dtu
* @return
*/
public int insertSysDtuRemark(SysDtuRemark sysDtuRemark);
/**
* dtu
*
* @param sysDtuRemark dtu
* @return
*/
public int updateSysDtuRemark(SysDtuRemark sysDtuRemark);
/**
* dtu
*
* @param id dtu
* @return
*/
public int deleteSysDtuRemarkById(Long id);
/**
* dtu
*
* @param ids
* @return
*/
public int deleteSysDtuRemarkByIds(Long[] ids);
}

View File

@ -0,0 +1,61 @@
package com.agri.system.service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.agri.system.domain.SysDtuRemark;
/**
* dtuService
*
* @author lld
* @date 2026-01-21
*/
public interface ISysDtuRemarkService extends IService<SysDtuRemark> {
/**
* dtu
*
* @param id dtu
* @return dtu
*/
public SysDtuRemark selectSysDtuRemarkById(Long id);
/**
* dtu
*
* @param sysDtuRemark dtu
* @return dtu
*/
public List<SysDtuRemark> selectSysDtuRemarkList(SysDtuRemark sysDtuRemark);
/**
* dtu
*
* @param sysDtuRemark dtu
* @return
*/
public int insertSysDtuRemark(SysDtuRemark sysDtuRemark);
/**
* dtu
*
* @param sysDtuRemark dtu
* @return
*/
public int updateSysDtuRemark(SysDtuRemark sysDtuRemark);
/**
* dtu
*
* @param ids dtu
* @return
*/
public int deleteSysDtuRemarkByIds(Long[] ids);
/**
* dtu
*
* @param id dtu
* @return
*/
public int deleteSysDtuRemarkById(Long id);
}

View File

@ -0,0 +1,94 @@
package com.agri.system.service.impl;
import java.util.List;
import com.agri.common.utils.DateUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.agri.system.mapper.SysDtuRemarkMapper;
import com.agri.system.domain.SysDtuRemark;
import com.agri.system.service.ISysDtuRemarkService;
/**
* dtuService
*
* @author lld
* @date 2026-01-21
*/
@Service
public class SysDtuRemarkServiceImpl extends ServiceImpl<SysDtuRemarkMapper, SysDtuRemark> implements ISysDtuRemarkService
{
/**
* dtu
*
* @param id dtu
* @return dtu
*/
@Override
public SysDtuRemark selectSysDtuRemarkById(Long id)
{
return baseMapper.selectSysDtuRemarkById(id);
}
/**
* dtu
*
* @param sysDtuRemark dtu
* @return dtu
*/
@Override
public List<SysDtuRemark> selectSysDtuRemarkList(SysDtuRemark sysDtuRemark)
{
return baseMapper.selectSysDtuRemarkList(sysDtuRemark);
}
/**
* dtu
*
* @param sysDtuRemark dtu
* @return
*/
@Override
public int insertSysDtuRemark(SysDtuRemark sysDtuRemark)
{
sysDtuRemark.setCreateTime(DateUtils.getNowDate());
return baseMapper.insertSysDtuRemark(sysDtuRemark);
}
/**
* dtu
*
* @param sysDtuRemark dtu
* @return
*/
@Override
public int updateSysDtuRemark(SysDtuRemark sysDtuRemark)
{
sysDtuRemark.setUpdateTime(DateUtils.getNowDate());
return baseMapper.updateSysDtuRemark(sysDtuRemark);
}
/**
* dtu
*
* @param ids dtu
* @return
*/
@Override
public int deleteSysDtuRemarkByIds(Long[] ids)
{
return baseMapper.deleteSysDtuRemarkByIds(ids);
}
/**
* dtu
*
* @param id dtu
* @return
*/
@Override
public int deleteSysDtuRemarkById(Long id)
{
return baseMapper.deleteSysDtuRemarkById(id);
}
}

View File

@ -0,0 +1,144 @@
<?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.agri.system.mapper.SysDtuRemarkMapper">
<resultMap type="SysDtuRemark" id="SysDtuRemarkResult">
<result property="id" column="id" />
<result property="imei" column="imei" />
<result property="jbk" column="jbk" />
<result property="jbg" column="jbg" />
<result property="jm1k" column="jm1k" />
<result property="jm1g" column="jm1g" />
<result property="jm2k" column="jm2k" />
<result property="jm2g" column="jm2g" />
<result property="jm3k" column="jm3k" />
<result property="jm3g" column="jm3g" />
<result property="temp1" column="temp1" />
<result property="humi1" column="humi1" />
<result property="temp2" column="temp2" />
<result property="humi2" column="humi2" />
<result property="temp3" column="temp3" />
<result property="humi3" column="humi3" />
<result property="temp4" column="temp4" />
<result property="humi4" column="humi4" />
<result property="version" column="version" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="extJson" column="ext_json" />
</resultMap>
<sql id="selectSysDtuRemarkVo">
select id, imei, jbk, jbg, jm1k, jm1g, jm2k, jm2g, jm3k, jm3g, temp1, humi1, temp2, humi2, temp3, humi3, temp4, humi4, version, create_by, create_time, update_by, update_time, ext_json from sys_dtu_remark
</sql>
<select id="selectSysDtuRemarkList" parameterType="SysDtuRemark" resultMap="SysDtuRemarkResult">
<include refid="selectSysDtuRemarkVo"/>
<where>
<if test="imei != null and imei != ''"> and imei like concat('%', #{imei}, '%')</if>
</where>
</select>
<select id="selectSysDtuRemarkById" parameterType="Long" resultMap="SysDtuRemarkResult">
<include refid="selectSysDtuRemarkVo"/>
where id = #{id}
</select>
<insert id="insertSysDtuRemark" parameterType="SysDtuRemark" useGeneratedKeys="true" keyProperty="id">
insert into sys_dtu_remark
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="imei != null and imei != ''">imei,</if>
<if test="jbk != null">jbk,</if>
<if test="jbg != null">jbg,</if>
<if test="jm1k != null">jm1k,</if>
<if test="jm1g != null">jm1g,</if>
<if test="jm2k != null">jm2k,</if>
<if test="jm2g != null">jm2g,</if>
<if test="jm3k != null">jm3k,</if>
<if test="jm3g != null">jm3g,</if>
<if test="temp1 != null">temp1,</if>
<if test="humi1 != null">humi1,</if>
<if test="temp2 != null">temp2,</if>
<if test="humi2 != null">humi2,</if>
<if test="temp3 != null">temp3,</if>
<if test="humi3 != null">humi3,</if>
<if test="temp4 != null">temp4,</if>
<if test="humi4 != null">humi4,</if>
<if test="version != null">version,</if>
create_by,
create_time,
update_by,
update_time,
<if test="extJson != null">ext_json,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="imei != null and imei != ''">#{imei},</if>
<if test="jbk != null">#{jbk},</if>
<if test="jbg != null">#{jbg},</if>
<if test="jm1k != null">#{jm1k},</if>
<if test="jm1g != null">#{jm1g},</if>
<if test="jm2k != null">#{jm2k},</if>
<if test="jm2g != null">#{jm2g},</if>
<if test="jm3k != null">#{jm3k},</if>
<if test="jm3g != null">#{jm3g},</if>
<if test="temp1 != null">#{temp1},</if>
<if test="humi1 != null">#{humi1},</if>
<if test="temp2 != null">#{temp2},</if>
<if test="humi2 != null">#{humi2},</if>
<if test="temp3 != null">#{temp3},</if>
<if test="humi3 != null">#{humi3},</if>
<if test="temp4 != null">#{temp4},</if>
<if test="humi4 != null">#{humi4},</if>
<if test="version != null">#{version},</if>
#{createBy},
#{createTime},
#{updateBy},
#{updateTime},
<if test="extJson != null">#{extJson},</if>
</trim>
</insert>
<update id="updateSysDtuRemark" parameterType="SysDtuRemark">
update sys_dtu_remark
<trim prefix="SET" suffixOverrides=",">
<if test="imei != null and imei != ''">imei = #{imei},</if>
<if test="jbk != null">jbk = #{jbk},</if>
<if test="jbg != null">jbg = #{jbg},</if>
<if test="jm1k != null">jm1k = #{jm1k},</if>
<if test="jm1g != null">jm1g = #{jm1g},</if>
<if test="jm2k != null">jm2k = #{jm2k},</if>
<if test="jm2g != null">jm2g = #{jm2g},</if>
<if test="jm3k != null">jm3k = #{jm3k},</if>
<if test="jm3g != null">jm3g = #{jm3g},</if>
<if test="temp1 != null">temp1 = #{temp1},</if>
<if test="humi1 != null">humi1 = #{humi1},</if>
<if test="temp2 != null">temp2 = #{temp2},</if>
<if test="humi2 != null">humi2 = #{humi2},</if>
<if test="temp3 != null">temp3 = #{temp3},</if>
<if test="humi3 != null">humi3 = #{humi3},</if>
<if test="temp4 != null">temp4 = #{temp4},</if>
<if test="humi4 != null">humi4 = #{humi4},</if>
create_by = #{createBy},
create_time = #{createTime},
update_by = #{updateBy},
update_time = #{updateTime},
<if test="version != null">version = #{version},</if>
<if test="extJson != null">ext_json = #{extJson},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteSysDtuRemarkById" parameterType="Long">
delete from sys_dtu_remark where id = #{id}
</delete>
<delete id="deleteSysDtuRemarkByIds" parameterType="String">
delete from sys_dtu_remark where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>