作者 钟来

完善mqtt数据服务指令控制功能,添加产品标签功能,修改代码生成bug

package ${packageName}.${modlePath}.controller.${moduleName};
import java.util.List;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.enums.DataSourceType;
import com.zhonglai.luhui.datasource.enums.DataSource;
import com.zhonglai.luhui.datasource.enums.DataSourceType;
import javax.servlet.http.HttpServletResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
... ...
... ... @@ -130,6 +130,17 @@ public class IotDevice implements Serializable
@ApiModelProperty("操作令牌")
private String operation_token;
@ApiModelProperty("产品标签")
private String label;
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getOperation_token() {
return operation_token;
}
... ...
package com.zhonglai.luhui.device.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.ruoyi.common.tool.BaseEntity;
/**
* 【请填写功能名称】对象 iot_product_label
*
* @author zhonglai
* @date 2024-07-22
*/
@ApiModel("【请填写功能名称】")
public class IotProductLabel extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键 */
private Integer id;
/** 产品id */
@ApiModelProperty(value="产品id")
private Integer productId;
/** 标签名称 */
@ApiModelProperty(value="标签名称")
private String labelName;
/** 标签key */
@ApiModelProperty(value="标签key")
private String labelKey;
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return id;
}
public void setProductId(Integer productId)
{
this.productId = productId;
}
public Integer getProductId()
{
return productId;
}
public void setLabelName(String labelName)
{
this.labelName = labelName;
}
public String getLabelName()
{
return labelName;
}
public void setLabelKey(String labelKey)
{
this.labelKey = labelKey;
}
public String getLabelKey()
{
return labelKey;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("productId", getProductId())
.append("labelName", getLabelName())
.append("labelKey", getLabelKey())
.append("createTime", getCreateTime())
.toString();
}
}
... ...
... ... @@ -35,10 +35,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="device_life" column="device_life" />
<result property="data_update_time" column="data_update_time" />
<result property="operation_token" column="operation_token" />
<result property="label" column="label" />
</resultMap>
<sql id="selectIotDeviceVo">
select active_time, client_id, completion_auth, create_by, create_time, del_flag, firmware_version, img_url, is_shadow, latitude, location_way, longitude, `name`, network_address, network_ip, remark, rssi, status, summary, things_model_value, update_by, update_time, product_id,mqtt_username,payload_type,things_model_config,listen_service_ip,device_life,data_update_time,mqtt_username,operation_token from iot_device
select * from iot_device
</sql>
<select id="selectIotDeviceList" parameterType="IotDevice" resultMap="IotDeviceResult">
... ...
... ... @@ -60,11 +60,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="listen_service_ip" column="listen_service_ip" />
<result property="device_life" column="device_life" />
<result property="data_update_time" column="d_data_update_time" />
<result property="label" column="label" />
</resultMap>
<sql id="selectIotTerminalVo">
select device_id, id, `name`, things_model_value, update_time,things_model_config,product_id,mqtt_username,data_update_time from iot_terminal
select * from iot_terminal
</sql>
<select id="selectIotTerminalList" parameterType="IotTerminal" resultMap="IotTerminalResult">
... ...
... ... @@ -5,9 +5,12 @@ import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.DateUtils;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.dao.service.PublicService;
import com.zhonglai.luhui.security.utils.SecurityUtils;
import com.zhonglai.luhui.sys.utils.ExcelUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -39,6 +42,9 @@ public class IotDeviceController extends BaseController
{
@Autowired
private IIotDeviceService iotDeviceService;
@Autowired
private PublicService publicService;
/**
* 查询主机/网关列表
*/
... ... @@ -116,4 +122,18 @@ public class IotDeviceController extends BaseController
{
return toAjax(iotDeviceService.deleteIotDeviceByClient_ids(client_ids));
}
@ApiOperation("给主机/网关打标签")
@ApiImplicitParams({
@ApiImplicitParam(value = "标签(多个英文逗号分割)",name = "label"),
@ApiImplicitParam(value = "设备主键",name = "client_id")
})
@PreAuthorize("@ss.hasPermi('iot:IotDevice:add')")
@Log(title = "主机/网关", businessType = BusinessType.INSERT)
@PostMapping("tagging/{client_id}")
public AjaxResult tagging(@PathVariable String client_id, String label)
{
int i = publicService.updateBySql("UPDATE `iot_device` SET label='"+label+"' WHERE client_id='"+client_id+"'");
return toAjax(i);
}
}
... ...
package com.zhonglai.luhui.admin.controller.iot;
import java.util.List;
import com.zhonglai.luhui.datasource.enums.DataSource;
import com.zhonglai.luhui.datasource.enums.DataSourceType;
import javax.servlet.http.HttpServletResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.zhonglai.luhui.action.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.zhonglai.luhui.dao.service.PublicTemplateService;
import com.zhonglai.luhui.device.domain.IotProductLabel;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 产品标签Controller
*
* @author zhonglai
* @date 2024-07-22
*/
@Api(tags = "产品标签")
@RestController
@RequestMapping("/iot/product_label")
public class IotProductLabelController extends BaseController
{
@Autowired
private PublicTemplateService publicTemplateService;
@ApiOperation(value ="查询产品标签列表",notes="\n" +
"公共参数描述:\n" +
"条件参数:\n" +
"timeMap; //时间条件(如:{\"create_time\":[开始时间,结束时间]})\n" +
"keyValue; //模糊匹配的关键字(如:[\"value\",\"name,no\"])\n" +
"queryParams; //字段对应的比较符号(如:{\"id\":\"EQ\"})\n" +
"orderBy; //排序(如:\"id desc,name asc\")\n" +
"\n" +
"分页参数:\n" +
"pageNum; //当前记录起始索引,从1开始\n" +
"pageSize; //每页显示记录数")
@GetMapping("/list/{productId}")
public AjaxResult list(@PathVariable Integer productId)
{
IotProductLabel iotProductLabel = new IotProductLabel();
iotProductLabel.setProductId(productId);
List<IotProductLabel> list = publicTemplateService.selectTList(iotProductLabel);
return AjaxResult.success(list);
}
@ApiOperation("获取产品标签详细信息")
@PreAuthorize("@ss.hasPermi('iot:product_label:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Integer id)
{
return success(publicTemplateService.getTById(id, IotProductLabel.class));
}
@ApiOperation("新增产品标签")
@PreAuthorize("@ss.hasPermi('iot:product_label:add')")
@Log(title = "产品标签", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody IotProductLabel iotProductLabel)
{
return toAjax(publicTemplateService.add(iotProductLabel));
}
@ApiOperation("修改产品标签")
@PreAuthorize("@ss.hasPermi('iot:product_label:edit')")
@Log(title = "产品标签", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody IotProductLabel iotProductLabel)
{
return toAjax(publicTemplateService.edit((iotProductLabel)));
}
@ApiOperation("删除产品标签")
@PreAuthorize("@ss.hasPermi('iot:product_label:remove')")
@Log(title = "产品标签", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Integer[] ids)
{
return toAjax(publicTemplateService.removeByIds(IotProductLabel.class,ids));
}
}
... ...
package com.zhonglai.luhui.admin.service;
import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.tool.BaseEntity;
import com.ruoyi.system.domain.entity.SysRole;
import com.ruoyi.system.domain.entity.SysUser;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.security.dto.BaseLoginUser;
import com.zhonglai.luhui.security.utils.SecurityUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
/**
* 数据过滤处理
*
* @author ruoyi
*/
@Aspect
@Component
public class DataScopeAspect
{
/**
* 全部数据权限
*/
public static final String DATA_SCOPE_ALL = "1";
/**
* 自定数据权限
*/
public static final String DATA_SCOPE_CUSTOM = "2";
/**
* 部门数据权限
*/
public static final String DATA_SCOPE_DEPT = "3";
/**
* 部门及以下数据权限
*/
public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";
/**
* 仅本人数据权限
*/
public static final String DATA_SCOPE_SELF = "5";
/**
* 数据权限过滤关键字
*/
public static final String DATA_SCOPE = "dataScope";
@Before("@annotation(controllerDataScope)")
public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable
{
clearDataScope(point);
handleDataScope(point, controllerDataScope);
}
protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope)
{
// 获取当前的用户
BaseLoginUser loginUser = SecurityUtils.getLoginUser();
if (StringUtils.isNotNull(loginUser))
{
SysUser currentUser = (SysUser) loginUser.getUser();
// 如果是超级管理员,则不过滤数据
if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin())
{
dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
controllerDataScope.userAlias());
}
}
}
/**
* 数据范围过滤
*
* @param joinPoint 切点
* @param user 用户
* @param userAlias 别名
*/
public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias)
{
StringBuilder sqlString = new StringBuilder();
for (SysRole role : user.getRoles())
{
String dataScope = role.getDataScope();
if (DATA_SCOPE_ALL.equals(dataScope))
{
sqlString = new StringBuilder();
break;
}
else if (DATA_SCOPE_CUSTOM.equals(dataScope))
{
sqlString.append(StringUtils.format(
" OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias,
role.getRoleId()));
}
else if (DATA_SCOPE_DEPT.equals(dataScope))
{
sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId()));
}
else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope))
{
sqlString.append(StringUtils.format(
" OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
deptAlias, user.getDeptId(), user.getDeptId()));
}
else if (DATA_SCOPE_SELF.equals(dataScope))
{
if (StringUtils.isNotBlank(userAlias))
{
sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId()));
}
else
{
// 数据权限为仅本人且没有userAlias别名不查询任何数据
sqlString.append(" OR 1=0 ");
}
}
}
if (StringUtils.isNotBlank(sqlString.toString()))
{
Object params = joinPoint.getArgs()[0];
if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
{
BaseEntity baseEntity = (BaseEntity) params;
baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")");
}
}
}
/**
* 拼接权限sql前先清空params.dataScope参数防止注入
*/
private void clearDataScope(final JoinPoint joinPoint)
{
Object params = joinPoint.getArgs()[0];
if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
{
BaseEntity baseEntity = (BaseEntity) params;
baseEntity.getParams().put(DATA_SCOPE, "");
}
}
}
package com.zhonglai.luhui.device.protocol.factory.service;
import cn.hutool.core.bean.BeanUtil;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.device.analysis.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelDataTypeEnum;
import com.zhonglai.luhui.device.domain.*;
import com.zhonglai.luhui.device.protocol.factory.config.DeviceCach;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
... ...
... ... @@ -2,11 +2,15 @@ package com.zhonglai.luhui.mqtt.service.proxy;
import com.zhonglai.luhui.device.analysis.comm.config.CacheConfig;
import com.zhonglai.luhui.device.analysis.comm.config.FastJson2JsonRedisSerializer;
import com.zhonglai.luhui.mqtt.service.proxy.comm.service.TerminalServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.core.io.ClassPathResource;
... ... @@ -28,7 +32,8 @@ import java.util.Collections;
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
public class MqttServiceListenApplication {
private static Logger log = LoggerFactory.getLogger(MqttServiceListenApplication.class);
@Autowired
private TerminalServiceImpl terminalService;
public static void main(String[] args) {
log.info("启动服务");
String RunInIDEA = checkRunInIDEA();
... ... @@ -54,4 +59,13 @@ public class MqttServiceListenApplication {
}
}
@Bean
public CommandLineRunner runAfterStartup() {
return args -> {
// 在这里编写启动后需要执行的逻辑
System.out.println("Spring Boot 应用已启动完成,执行额外的加载操作...");
// 执行加载数据库,连接外部服务等操作
terminalService.startMqttListenerService();
};
}
}
... ...
... ... @@ -11,6 +11,7 @@ import lombok.SneakyThrows;
import org.eclipse.paho.client.mqttv3.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.List;
... ...
... ... @@ -15,6 +15,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
... ... @@ -69,7 +70,6 @@ public class TerminalServiceImpl {
mqttclient.connect(options);
}
@PostConstruct
public void startMqttListenerService() throws MqttException, IOException {
fileChangeListener.onApplicationEvent();
log.info("-----------开始启动mqtt监听服务--------------------");
... ...
... ... @@ -5,10 +5,12 @@ import com.alibaba.fastjson.util.IOUtils;
import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.protocol.factory.control.DeviceCommandListenService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
... ... @@ -24,6 +26,15 @@ import java.util.zip.ZipFile;
@Controller
@RequestMapping("/log")
public class LogController {
@Autowired
private DeviceCommandListenService deviceCommandListenService;
@ApiOperation("获取")
@RequestMapping(value = "getOperation_token",method = RequestMethod.GET)
public String getOperation_token()
{
return deviceCommandListenService.getSelectorExpression();
}
@ApiOperation("获取一天的日志")
@ApiImplicitParams({
@ApiImplicitParam(value = "时间(格式:20230114)",name = "time"),
... ...
... ... @@ -28,7 +28,7 @@ mqtt:
client:
#客户端操作时间
operationTime: 10
# productids: 27,23
productids: 27,23
#rocketmq配置信息
rocketmq:
... ...