mqtt架构重构
parent
658006e14a
commit
17f8af0901
|
|
@ -6,10 +6,10 @@ spring:
|
||||||
password: Admin#12345678 # Mosquitto密码
|
password: Admin#12345678 # Mosquitto密码
|
||||||
client-id: springboot-backend # 截取UUID前8位(自动去横线)
|
client-id: springboot-backend # 截取UUID前8位(自动去横线)
|
||||||
default-topic: dtu/+/up,frontend/+/control/+,frontend/+/online # 后端监听的主题
|
default-topic: dtu/+/up,frontend/+/control/+,frontend/+/online # 后端监听的主题
|
||||||
qos: 1 # 消息可靠性
|
qos: 0 # 消息可靠性
|
||||||
timeout: 60 # 连接超时
|
timeout: 60 # 连接超时
|
||||||
keep-alive: 60 # 心跳间隔
|
keep-alive: 60 # 心跳间隔
|
||||||
latest-ttl-seconds: 120 #设备最新状态缓存的过期时间(秒)。
|
latest-ttl-seconds: 120 #设备最新状态缓存的过期时间(秒)。
|
||||||
# 自动关闭任务线程池大小
|
# 自动关闭任务线程池大小
|
||||||
auto-off-thread-pool-size: 5
|
auto-off-thread-pool-size: 5
|
||||||
sub-ttl-seconds: 3600 # 在线新跳ttl
|
subc-ttl-seconds: 3600 # 在线新跳ttl
|
||||||
|
|
@ -125,7 +125,7 @@ public class MqttConfig {
|
||||||
connectOptions.setCleanSession(false);
|
connectOptions.setCleanSession(false);
|
||||||
|
|
||||||
// 开启自动重连:连接断开后自动尝试重连,提升稳定性(方案A核心)
|
// 开启自动重连:连接断开后自动尝试重连,提升稳定性(方案A核心)
|
||||||
connectOptions.setAutomaticReconnect(true);
|
connectOptions.setAutomaticReconnect(false);
|
||||||
// 设置最大重连间隔(秒):避免频繁重连消耗资源
|
// 设置最大重连间隔(秒):避免频繁重连消耗资源
|
||||||
connectOptions.setMaxReconnectDelay(30);
|
connectOptions.setMaxReconnectDelay(30);
|
||||||
return connectOptions;
|
return connectOptions;
|
||||||
|
|
|
||||||
|
|
@ -181,7 +181,7 @@ public class MqttMessageHandler implements SmartLifecycle {
|
||||||
int[] qosArray = new int[topics.length];
|
int[] qosArray = new int[topics.length];
|
||||||
// 按主题类型设置QoS:控制指令/状态用QoS 1
|
// 按主题类型设置QoS:控制指令/状态用QoS 1
|
||||||
for (int i = 0; i < topics.length; i++) {
|
for (int i = 0; i < topics.length; i++) {
|
||||||
qosArray[i] = 1;
|
qosArray[i] = 0;
|
||||||
topics[i] = topics[i].trim();
|
topics[i] = topics[i].trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -289,6 +289,7 @@ public class MqttMessageHandler implements SmartLifecycle {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// log.info("【设备处理】JSON解析:{}",payloadObj);
|
||||||
// 解析设备ID:主题格式为dtu/{deviceId}/up,分割后第2个元素是设备ID
|
// 解析设备ID:主题格式为dtu/{deviceId}/up,分割后第2个元素是设备ID
|
||||||
String deviceId = topic.split("/")[1];
|
String deviceId = topic.split("/")[1];
|
||||||
|
|
||||||
|
|
@ -394,7 +395,7 @@ public class MqttMessageHandler implements SmartLifecycle {
|
||||||
String frontendTopic = "frontend/" + clientId + "/dtu/" + deviceId + "/listener";
|
String frontendTopic = "frontend/" + clientId + "/dtu/" + deviceId + "/listener";
|
||||||
// 发布消息
|
// 发布消息
|
||||||
mqttMessageSender.publish(frontendTopic, payload);
|
mqttMessageSender.publish(frontendTopic, payload);
|
||||||
// log.info("【设备状态转发】设备{} → 前端{},主题:{}", deviceId, clientId, frontendTopic);
|
log.info("【设备状态转发】设备{} → 前端{},主题:{}", deviceId, clientId, frontendTopic);
|
||||||
}
|
}
|
||||||
// 删掉设备对应的客户端
|
// 删掉设备对应的客户端
|
||||||
if (stale != null && !stale.isEmpty()) {
|
if (stale != null && !stale.isEmpty()) {
|
||||||
|
|
@ -575,7 +576,7 @@ public class MqttMessageHandler implements SmartLifecycle {
|
||||||
|
|
||||||
String deviceTopic = "dtu/" + deviceId + "/down";
|
String deviceTopic = "dtu/" + deviceId + "/down";
|
||||||
//todo
|
//todo
|
||||||
// mqttMessageSender.publish(deviceTopic, down.toJSONString());
|
mqttMessageSender.publish(deviceTopic, down.toJSONString());
|
||||||
log.info("【自动关任务】检测仍在运行,已下发关闭:deviceId={}, funcType={}, payload={}", deviceId, funcType, down.toJSONString());
|
log.info("【自动关任务】检测仍在运行,已下发关闭:deviceId={}, funcType={}, payload={}", deviceId, funcType, down.toJSONString());
|
||||||
} else {
|
} else {
|
||||||
log.info("【自动关任务】检测未运行或状态未知,跳过关闭:deviceId={}, funcType={}, current={}", deviceId, funcType, current);
|
log.info("【自动关任务】检测未运行或状态未知,跳过关闭:deviceId={}, funcType={}, current={}", deviceId, funcType, current);
|
||||||
|
|
@ -644,7 +645,7 @@ public class MqttMessageHandler implements SmartLifecycle {
|
||||||
// 4. 转发指令到设备
|
// 4. 转发指令到设备
|
||||||
String deviceTopic = "dtu/" + deviceId + "/down";
|
String deviceTopic = "dtu/" + deviceId + "/down";
|
||||||
//todo
|
//todo
|
||||||
// mqttMessageSender.publish(deviceTopic, payload);
|
mqttMessageSender.publish(deviceTopic, payload);
|
||||||
log.info("【指令转发】前端{} → 设备{}的{}功能", clientId, deviceId, funcType);
|
log.info("【指令转发】前端{} → 设备{}的{}功能", clientId, deviceId, funcType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -667,7 +668,7 @@ public class MqttMessageHandler implements SmartLifecycle {
|
||||||
stringRedisTemplate.expire("subc:" + clientId, subcTtlSeconds, TimeUnit.SECONDS);
|
stringRedisTemplate.expire("subc:" + clientId, subcTtlSeconds, TimeUnit.SECONDS);
|
||||||
|
|
||||||
// todo 生产环境不建议打印每次心跳
|
// todo 生产环境不建议打印每次心跳
|
||||||
log.debug("【在线心跳】clientId={} 续期subcTTL={}s payload={}", clientId, subcTtlSeconds, payload);
|
// log.debug("【在线心跳】clientId={} 续期subcTTL={}s payload={}", clientId, subcTtlSeconds, payload);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.warn("【在线心跳】处理失败 topic={} msg={}", topic, e.getMessage());
|
log.warn("【在线心跳】处理失败 topic={} msg={}", topic, e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
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.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.agri.common.annotation.Excel;
|
import com.agri.common.annotation.Excel;
|
||||||
#if($table.crud || $table.sub)
|
#if($table.crud || $table.sub)
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import com.agri.common.utils.DateUtils;
|
||||||
#break
|
#break
|
||||||
#end
|
#end
|
||||||
#end
|
#end
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
#if($table.sub)
|
#if($table.sub)
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,11 @@
|
||||||
<groupId>com.agri</groupId>
|
<groupId>com.agri</groupId>
|
||||||
<artifactId>agri-common</artifactId>
|
<artifactId>agri-common</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dtu设备备注Controller
|
||||||
|
*
|
||||||
|
* @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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dtu设备备注Mapper接口
|
||||||
|
*
|
||||||
|
* @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);
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dtu设备备注Service接口
|
||||||
|
*
|
||||||
|
* @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);
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dtu设备备注Service业务层处理
|
||||||
|
*
|
||||||
|
* @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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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>
|
||||||
Loading…
Reference in New Issue