From 8222b69e488c6c01b72f393b3174de00bd541bbb Mon Sep 17 00:00:00 2001 From: zhuangtianxiang <2913129173@qq.com> Date: Fri, 28 Feb 2025 17:23:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(iot):=20=E4=B8=BA=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BB=8F=E5=BA=A6=E3=80=81=E7=BA=AC=E5=BA=A6?= =?UTF-8?q?=E5=92=8C=E5=9B=BE=E6=A0=87=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 Device 和 DeviceVo 类中添加 longitude、latitude 和 icon 字段 - 更新 DeviceMapper.xml以支持新字段的映射- 修改数据库结构,在 iot_device 表中添加新字段 - 插入测试数据以验证新功能 --- pom.xml | 10 +- .../modules/iot/device/entity/Device.java | 15 + .../modules/iot/device/vo/DeviceVo.java | 16 + .../modules/mqtt/config/MqttConfig.java | 303 ++++++++++++++++++ .../modules/mqtt/config/MqttSender.java | 49 +++ .../config/UploadDataSocketProcessor.java | 73 +++++ src/main/resources/db/gateway.sql | 83 +++++ .../db/gateway/public/iot_device.sql | 18 +- .../resources/mappers/iot/DeviceMapper.xml | 3 + 9 files changed, 560 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/zsc/edu/gateway/modules/mqtt/config/MqttConfig.java create mode 100644 src/main/java/com/zsc/edu/gateway/modules/mqtt/config/MqttSender.java create mode 100644 src/main/java/com/zsc/edu/gateway/modules/mqtt/config/UploadDataSocketProcessor.java diff --git a/pom.xml b/pom.xml index 2838b29..1a2d496 100644 --- a/pom.xml +++ b/pom.xml @@ -152,11 +152,11 @@ jjwt 0.9.1 - - org.springframework.boot - spring-boot-starter-aop - - + + + org.springframework.integration + spring-integration-mqtt + org.springframework.boot diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/entity/Device.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/entity/Device.java index 4198909..b29d17c 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/entity/Device.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/entity/Device.java @@ -98,6 +98,21 @@ public class Device extends BaseEntity { @TableField(value = "dept_id", fill = FieldFill.INSERT) public Long deptId; + /** + * 设备经度 + */ + public Double longitude; + + /** + * 设备纬度 + */ + public Double latitude; + + /** + * 设备图标 + */ + public String icon; + public enum Status implements IEnum, IState { UNACTIVATED(0, "未激活"), diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/vo/DeviceVo.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/vo/DeviceVo.java index 46057e6..3ef2c9e 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/vo/DeviceVo.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/vo/DeviceVo.java @@ -96,6 +96,22 @@ public class DeviceVo { */ public String deviceUpdateBy; + /** + * 设备经度 + */ + public Double longitude; + + /** + * 设备纬度 + */ + public Double latitude; + + /** + * 设备图标 + */ + public String icon; + + /** * 所属产品ID */ diff --git a/src/main/java/com/zsc/edu/gateway/modules/mqtt/config/MqttConfig.java b/src/main/java/com/zsc/edu/gateway/modules/mqtt/config/MqttConfig.java new file mode 100644 index 0000000..cd999a2 --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/modules/mqtt/config/MqttConfig.java @@ -0,0 +1,303 @@ +//package com.zsc.edu.gateway.modules.mqtt.config; +// +//import com.zsc.edu.gateway.modules.iot.device.vo.DeviceVo; +//import jakarta.annotation.Resource; +//import lombok.extern.slf4j.Slf4j; +//import org.eclipse.paho.client.mqttv3.MqttConnectOptions; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.boot.configurationprocessor.json.JSONObject; +//import org.springframework.context.ApplicationContext; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.integration.annotation.ServiceActivator; +//import org.springframework.integration.channel.DirectChannel; +//import org.springframework.integration.core.MessageProducer; +//import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory; +//import org.springframework.integration.mqtt.core.MqttPahoClientFactory; +//import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter; +//import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler; +//import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter; +//import org.springframework.messaging.MessageChannel; +//import org.springframework.messaging.MessageHandler; +//import org.springframework.util.StringUtils; +// +//import java.io.IOException; +//import java.text.ParseException; +//import java.text.SimpleDateFormat; +//import java.util.Date; +//import java.util.TimeZone; +//import java.util.UUID; +// +//@Slf4j +//@Configuration +//public class MqttConfig { +// +// @Resource +// private ApplicationContext applicationContext; +// @Resource +// private UploadDataSocketProcessor uploadDataSocketProcessor; +// +// +// public static final String CHANNEL_OUT = "mqttOutboundChannel"; +// public static final String CHANNEL_IN = "mqttInputChannel"; +// +// private static final byte[] WILL_DATA; +// +// static { +// WILL_DATA = "offline".getBytes(); +// } +// +// @Value("${gatherer.version}") +// private String gatherer; +// @Value("${mqtt.username}") +// private String username; +// @Value("${mqtt.password}") +// private String password; +// @Value("${mqtt.host}") +// private String host; +// @Value("${mqtt.port}") +// private String port; +// @Value("${mqtt.topic}") +// private String topic; +// @Value("${mqtt.qos}") +// private Integer qos; +// +// /** +// * 创建MqttPahoClientFactory,设置MQTT Broker连接属性,如果使用ssl验证也在这里设置 +// * @return factory +// */ +// @Bean +// public MqttPahoClientFactory mqttPahoClientFactory() { +// DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); +// MqttConnectOptions options = new MqttConnectOptions(); +// +// if(StringUtils.hasText(username)) { +// options.setUserName(username); +// } +// +// options.setPassword(password.toCharArray()); +// +// options.setServerURIs(new String[]{host + ":" + port}); +// +// options.setConnectionTimeout(10); +// +// options.setKeepAliveInterval(20); +// +// options.setWill("willTopic", WILL_DATA, 2, false); +// factory.setConnectionOptions(options); +// +// return factory; +// } +// +// /** +// * 入站通道 +// */ +// @Bean +// public MessageChannel mqttInputChannel() { +// return new DirectChannel(); +// } +// +// /** +// * 入站 +// */ +// @Bean +// public MessageProducer inbound() { +// // Paho客户端消息驱动通道适配器,主要用来订阅主题 +// MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter( +// "clientId-" + UUID.randomUUID(), +// mqttPahoClientFactory(), +// "/v1/devices/+/datas" +// ); +// adapter.setCompletionTimeout(5000); +// +// // Paho消息转换器 +// DefaultPahoMessageConverter defaultPahoMessageConverter = new DefaultPahoMessageConverter(); +// +// // 按字节接收消息 +//// defaultPahoMessageConverter.setPayloadAsBytes(true); +// adapter.setConverter(defaultPahoMessageConverter); +// adapter.setQos(qos); +// adapter.setOutputChannel(mqttInputChannel()); +// return adapter; +// +// } +// +// /** +// * ServiceActivator注解表明: 当前方法用于处理MQTT消息,inputChannel参数指定了用于消费的channel +// * @return +// */ +// @Bean +// @ServiceActivator(inputChannel = CHANNEL_IN) +// public MessageHandler handler() { +// return message -> { +// String topic = message.getHeaders().get("mqtt_receivedTopic").toString(); +// String deviceCode = topic.split("/")[3]; +// String deviceGatherer = deviceCode.substring(0,3); +// if (topic.matches("/v1/devices/\\d{12}/datas") && deviceGatherer.equals(gatherer)) { +// JSONObject payload = JSONObject.parseObject(message.getPayload().toString()); +// Integer deviceModel = Integer.valueOf(deviceCode.substring(3,5)); +// log.info("获取设备编码:" + deviceCode); +// log.info("负载:" + payload); +// JSONObject data = (JSONObject) JSONPath.eval(payload, "$.devices[0].services[0].data"); +// DeviceVo deviceVo = null; +// switch (deviceModel) { +// case 2: +// deviceVo = decodeSpike(data, deviceCode, deviceModel); +// break; +// case 5: +// deviceVo = decodeCirculation(data, deviceCode, deviceModel); +// break; +// default: +// break; +// } +// if (deviceVo == null) return; // 或者抛出异常,根据你的需求处理 +// try { +// uploadDataSocketProcessor.processDeviceV2(null, deviceVo); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// } else { +// log.error("丢弃信息,主题["+ topic +"]"); +// } +// }; +// } +// +// private DeviceVo decodeCirculation(JSONObject data, String deviceCode, Integer deviceModel) { +// +//// "iccid": "89860818102381420337", +//// "imsi": "460088822108587", +//// "signal": 2, +//// "recordTime": "20241212T003246Z", +//// "battery": 100, +//// "current": 0, +//// "warning": 0 +// +// String iccid = data.getString("iccid"); +// String imsi = data.getString("imsi"); +// Integer signal = data.getInteger("signal"); +// String recordTimeString = data.getString("recordTime"); +// // 使用 SimpleDateFormat 解析日期字符串 +// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'"); +// Date recordTime; +// try { +// recordTime = dateFormat.parse(recordTimeString); +// } catch (ParseException e) { +// log.error("无法解析日期字符串: " + recordTimeString, e); +// return null; +// } +// Integer battery = data.getInteger("battery"); +// Float current = data.getFloat("current"); +// Integer warning = data.getInteger("warning"); +// +// Record record = new Record(); +// record.setWarn(warning); +//// record.setDeviceId(deviceId); +// record.setDeviceSignal(signal); +// record.setBattery(battery); +// record.setTemp1(current); +// record.setShakeWarn(warning & 1); +// record.setTemp1Warn(warning >> 1 & 1); +// record.setTemp2Warn(warning >> 2 & 1); +// record.setTemp3Warn(warning >> 3 & 1); +// record.setEarlyWarn(warning >> 4 & 1); +// record.setWarn(warning); +// record.setRecordTime(recordTime); +// DeviceVo deviceVo = new DeviceVo(); +// deviceVo.setClientId(deviceCode); +// deviceVo.setSimCode(iccid); +// deviceVo.setImeiCode(imsi); +// deviceVo.setDeviceModel(deviceModel); +// deviceVo.setWarn(warning); +// deviceVo.setRecordList(Lists.newArrayList(record)); +// return deviceVo; +// } +// +// private static DeviceVo decodeSpike(JSONObject data, String deviceCode, Integer deviceModel) { +//// "longitude": "31.2412402273", +//// "latitude": "121.473992206", +//// "iccid": "89860321047601121407", +//// "imsi": "460115009044492", +//// "signal": 1, +//// "recordTime": "20241205T124818Z", +//// "battery": 76, +//// "warning": 0 +// +// String iccid = data.getString("iccid"); +// String imsi = data.getString("imsi"); +// Integer signal = data.getInteger("signal"); +// String recordTimeString = data.getString("recordTime"); +// // 使用 SimpleDateFormat 解析日期字符串 +// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'"); +// Date recordTime; +// try { +// recordTime = dateFormat.parse(recordTimeString); +// } catch (ParseException e) { +// log.error("无法解析日期字符串: " + recordTimeString, e); +// return null; +// } +// Integer battery = data.getInteger("battery"); +// Integer warning = data.getInteger("warning"); +// +// int newWarn = 0; +// // 获取warn的最后三位 +// int lastThreeBits = warning & 0b111; +// // 检查最后三位是否为011 +// if (lastThreeBits == 0b011) { +// newWarn |= 1; // 设置newWarn的第一位为1 +// } +// // 获取warn的第四位的值 +// int fourthBit = (warning >> 3) & 1; +// // 将warn的第四位的值设置到newWarn的第八位 +// if (fourthBit == 1) { +// newWarn |= (1 << 8); // 设置newWarn的第八位为1 +// } +// +// Record record = new Record(); +// record.setWarn(newWarn); +//// record.setDeviceId(deviceId); +// record.setDeviceSignal(signal); +// record.setBattery(battery); +// record.setShakeWarn(newWarn & 1); +// record.setTemp1Warn(newWarn >> 1 & 1); +// record.setTemp2Warn(newWarn >> 2 & 1); +// record.setTemp3Warn(newWarn >> 3 & 1); +// record.setEarlyWarn(newWarn >> 4 & 1); +// record.setWarn(newWarn); +// record.setRecordTime(recordTime); +// DeviceVo deviceVo = new DeviceVo(); +// deviceVo.setClientId(deviceCode); +// deviceVo.setSimCode(iccid); +// deviceVo.setImeiCode(imsi); +// deviceVo.setDeviceModel(deviceModel); +// deviceVo.setWarn(newWarn); +// deviceVo.setRecordList(Lists.newArrayList(record)); +// return deviceVo; +// } +// +// +// /** +// * 出站通道 +// */ +// @Bean +// public MessageChannel mqttOutboundChannel() { +// return new DirectChannel(); +// } +// +// /** +// * 出站 +// */ +// @Bean +// @ServiceActivator(inputChannel = CHANNEL_OUT) +// public MessageHandler outbound() { +// MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler( +// "clientId" + UUID.randomUUID(), +// mqttPahoClientFactory() +// ); +// messageHandler.setAsync(true); +// messageHandler.setDefaultTopic(topic); +// messageHandler.setConverter(new DefaultPahoMessageConverter()); +// return messageHandler; +// +// } +// +//} diff --git a/src/main/java/com/zsc/edu/gateway/modules/mqtt/config/MqttSender.java b/src/main/java/com/zsc/edu/gateway/modules/mqtt/config/MqttSender.java new file mode 100644 index 0000000..a39e237 --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/modules/mqtt/config/MqttSender.java @@ -0,0 +1,49 @@ +//package com.zsc.edu.gateway.modules.mqtt.config; +// +//import org.springframework.integration.annotation.MessagingGateway; +//import org.springframework.integration.mqtt.support.MqttHeaders; +//import org.springframework.messaging.handler.annotation.Header; +//import org.springframework.stereotype.Component; +// +//@Component +//@MessagingGateway(defaultRequestChannel = MqttConfig.CHANNEL_OUT) +//public interface MqttSender { +// +// /** +// * 定义重载方法,用于消息发送 +// * @param payload +// */ +// void sendMsg(String payload); +// +// /** +// * 指定topic进行消息发送 +// * @param topic +// * @param payload +// */ +// void sendMsg(@Header(MqttHeaders.TOPIC) String topic, String payload); +// +// /** +// * 指定topic进行消息发送 +// * @param topic +// * @param retain +// * @param payload +// */ +// void sendMsg(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.RETAINED) boolean retain, String payload); +// +// +// /** +// * 指定topic进行消息发送 +// * @param topic +// * @param qos +// * @param payload +// */ +// void sendMsg(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload); +// +// /** +// * 指定topic进行消息发送 +// * @param topic +// * @param qos +// * @param payload +// */ +// void sendMsg(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, byte[] payload); +//} diff --git a/src/main/java/com/zsc/edu/gateway/modules/mqtt/config/UploadDataSocketProcessor.java b/src/main/java/com/zsc/edu/gateway/modules/mqtt/config/UploadDataSocketProcessor.java new file mode 100644 index 0000000..0168e74 --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/modules/mqtt/config/UploadDataSocketProcessor.java @@ -0,0 +1,73 @@ +package com.zsc.edu.gateway.modules.mqtt.config; + +import com.zsc.edu.gateway.modules.iot.device.vo.DeviceVo; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; + +@Slf4j +public class UploadDataSocketProcessor { + + /** + * 处理设备数据并上传 + * + * @param context 上下文对象,这里传入的是null + * @param deviceVo 设备数据对象 + * @throws IOException 如果上传过程中发生IO异常 + */ + public void processDeviceV2(Object context, DeviceVo deviceVo) throws IOException { + // 这里可以添加具体的上传逻辑 + // 例如,将设备数据转换为JSON格式并通过网络发送到服务器 + if (deviceVo == null) { + log.warn("尝试处理空的DeviceVo对象"); + return; + } + + // 示例:将DeviceVo对象转换为JSON字符串 + String deviceDataJson = convertDeviceVoToJson(deviceVo); + log.info("设备数据JSON: {}", deviceDataJson); + + // 示例:通过网络上传设备数据 + // 注意:这里需要替换为实际的上传逻辑 + uploadDeviceData(deviceDataJson); + } + + /** + * 将DeviceVo对象转换为JSON字符串 + * + * @param deviceVo 设备数据对象 + * @return JSON字符串 + */ + private String convertDeviceVoToJson(DeviceVo deviceVo) { + // 这里可以使用Jackson或其他JSON库进行转换 + // 示例:使用Jackson库 + try { + return new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(deviceVo); + } catch (Exception e) { + log.error("无法将DeviceVo对象转换为JSON", e); + return "{}"; + } + } + + /** + * 上传设备数据到服务器 + * + * @param deviceDataJson 设备数据的JSON字符串 + * @throws IOException 如果上传过程中发生IO异常 + */ + private void uploadDeviceData(String deviceDataJson) throws IOException { + // 这里可以添加具体的上传逻辑 + // 示例:通过HTTP POST请求上传数据 + // 注意:这里需要替换为实际的上传逻辑 + log.info("上传设备数据: {}", deviceDataJson); + // 示例:使用HttpClient发送POST请求 + // HttpClient httpClient = HttpClient.newHttpClient(); + // HttpRequest request = HttpRequest.newBuilder() + // .uri(URI.create("http://example.com/upload")) + // .header("Content-Type", "application/json") + // .POST(HttpRequest.BodyPublishers.ofString(deviceDataJson)) + // .build(); + // HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + // log.info("上传响应: {}", response.body()); + } +} diff --git a/src/main/resources/db/gateway.sql b/src/main/resources/db/gateway.sql index fc3d442..1c92a36 100644 --- a/src/main/resources/db/gateway.sql +++ b/src/main/resources/db/gateway.sql @@ -779,3 +779,86 @@ VALUES ('user', 'create', 'Created a new user', '2023-10-01 10:00:00'), ('property', 'update', 'Updated property value', '2023-10-01 12:00:00'), ('notice', 'create', 'Sent a notice', '2023-10-01 12:15:00'); + + +INSERT INTO iot_device (name, + online, + state, + hardware_version, + firmware_version, + factory_id, + client_id, + product_id, + extend_params, + properties, + create_by, + create_time, + update_by, + update_time, + remark, + dept_id, + create_id, + longitude, + latitude, + icon) +VALUES ('Device1', TRUE, 2, 'HW1.0', 'FW1.0', 'FAC12345', 'CLI12345', 1, '{ + "param1": "value1" +}', '{ + "prop1": "value1" +}', 'admin', CURRENT_TIMESTAMP, 'admin', CURRENT_TIMESTAMP, 'Device 1 remark', 1, 1, 31.241240, 121.473992, + 'icon1.png'), + ('Device2', FALSE, 0, 'HW1.1', 'FW1.1', 'FAC12346', 'CLI12346', 2, '{ + "param2": "value2" + }', '{ + "prop2": "value2" + }', 'admin', CURRENT_TIMESTAMP, 'admin', CURRENT_TIMESTAMP, 'Device 2 remark', 2, 2, 31.241241, 121.473993, + 'icon2.png'), + ('Device3', TRUE, 2, 'HW1.2', 'FW1.2', 'FAC12347', 'CLI12347', 1, '{ + "param3": "value3" + }', '{ + "prop3": "value3" + }', 'admin', CURRENT_TIMESTAMP, 'admin', CURRENT_TIMESTAMP, 'Device 3 remark', 1, 3, 31.241242, 121.473994, + 'icon3.png'), + ('Device4', FALSE, 1, 'HW1.3', 'FW1.3', 'FAC12348', 'CLI12348', 2, '{ + "param4": "value4" + }', '{ + "prop4": "value4" + }', 'admin', CURRENT_TIMESTAMP, 'admin', CURRENT_TIMESTAMP, 'Device 4 remark', 2, 4, 31.241243, 121.473995, + 'icon4.png'), + ('Device5', TRUE, 2, 'HW1.4', 'FW1.4', 'FAC12349', 'CLI12349', 1, '{ + "param5": "value5" + }', '{ + "prop5": "value5" + }', 'admin', CURRENT_TIMESTAMP, 'admin', CURRENT_TIMESTAMP, 'Device 5 remark', 1, 5, 31.241244, 121.473996, + 'icon5.png'), + ('Device6', FALSE, 0, 'HW1.5', 'FW1.5', 'FAC12350', 'CLI12350', 2, '{ + "param6": "value6" + }', '{ + "prop6": "value6" + }', 'admin', CURRENT_TIMESTAMP, 'admin', CURRENT_TIMESTAMP, 'Device 6 remark', 2, 6, 31.241245, 121.473997, + 'icon6.png'), + ('Device7', TRUE, 2, 'HW1.6', 'FW1.6', 'FAC12351', 'CLI12351', 1, '{ + "param7": "value7" + }', '{ + "prop7": "value7" + }', 'admin', CURRENT_TIMESTAMP, 'admin', CURRENT_TIMESTAMP, 'Device 7 remark', 1, 7, 31.241246, 121.473998, + 'icon7.png'), + ('Device8', FALSE, 1, 'HW1.7', 'FW1.7', 'FAC12352', 'CLI12352', 2, '{ + "param8": "value8" + }', '{ + "prop8": "value8" + }', 'admin', CURRENT_TIMESTAMP, 'admin', CURRENT_TIMESTAMP, 'Device 8 remark', 2, 8, 31.241247, 121.473999, + 'icon8.png'), + ('Device9', TRUE, 2, 'HW1.8', 'FW1.8', 'FAC12353', 'CLI12353', 1, '{ + "param9": "value9" + }', '{ + "prop9": "value9" + }', 'admin', CURRENT_TIMESTAMP, 'admin', CURRENT_TIMESTAMP, 'Device 9 remark', 1, 9, 31.241248, 121.474000, + 'icon9.png'), + ('Device10', FALSE, 0, 'HW1.9', 'FW1.9', 'FAC12354', 'CLI12354', 2, '{ + "param10": "value10" + }', '{ + "prop10": "value10" + }', 'admin', CURRENT_TIMESTAMP, 'admin', CURRENT_TIMESTAMP, 'Device 10 remark', 2, 10, 31.241249, 121.474001, + 'icon10.png'); + diff --git a/src/main/resources/db/gateway/public/iot_device.sql b/src/main/resources/db/gateway/public/iot_device.sql index d2e6cf6..b6d5b89 100644 --- a/src/main/resources/db/gateway/public/iot_device.sql +++ b/src/main/resources/db/gateway/public/iot_device.sql @@ -18,7 +18,11 @@ create table iot_device update_by varchar, update_time timestamp, remark varchar, - dept_id bigint + dept_id bigint, + create_id bigint, + longitude double precision, + latitude double precision, + icon varchar ); comment on column iot_device.id is '主键'; @@ -57,10 +61,14 @@ comment on column iot_device.remark is '备注'; comment on column iot_device.dept_id is '部门权限id'; +comment on column iot_device.create_id is '创建者id'; + +comment on column iot_device.longitude is '设备经度'; + +comment on column iot_device.latitude is '设备纬度'; + +comment on column iot_device.icon is '设备图标'; + alter table iot_device owner to gitea; -r -table iot_device -owner to gitea; - diff --git a/src/main/resources/mappers/iot/DeviceMapper.xml b/src/main/resources/mappers/iot/DeviceMapper.xml index e23ad7e..17653d0 100644 --- a/src/main/resources/mappers/iot/DeviceMapper.xml +++ b/src/main/resources/mappers/iot/DeviceMapper.xml @@ -22,6 +22,9 @@ + + +