From 87af5ba59f621f285a7b83580194be7216b0c622 Mon Sep 17 00:00:00 2001
From: 18650502300 <18650502300@163.com>
Date: Mon, 15 Apr 2024 15:24:26 +0800
Subject: [PATCH] =?UTF-8?q?1.=20=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/resources/application.yml | 2 +-
.../src/views/device/device/index.vue | 4 +-
.../device/controller/AsModelController.java | 10 +-
.../ruoyi/device/mapper/AsModelMapper.java | 22 +++--
.../ruoyi/device/service/IAsModelService.java | 25 +++--
.../ruoyi/device/service/IAsUserService.java | 42 ++++----
.../service/impl/AsDeviceServiceImpl.java | 97 ++++++++++++++++++-
.../service/impl/AsModelServiceImpl.java | 22 +++++
.../service/impl/AsUserServiceImpl.java | 3 +-
.../impl/AsWateringRecordServiceImpl.java | 4 +
.../resources/mapper/device/AsModelMapper.xml | 15 +--
11 files changed, 199 insertions(+), 47 deletions(-)
diff --git a/AutoSprout-admin/src/main/resources/application.yml b/AutoSprout-admin/src/main/resources/application.yml
index 512e31f..c5de30f 100644
--- a/AutoSprout-admin/src/main/resources/application.yml
+++ b/AutoSprout-admin/src/main/resources/application.yml
@@ -26,7 +26,7 @@ watering:
# iot秘钥
accessKey: dJqF0qYhUbK/o1Pr9I5qxNoP14FlJLC+BFK2ZTjUX+lnKwoNYvBYsM/7Xu1ERIzSkUoxVkP/N1RMvGlBKMoBtA==
# 超时响应时间(秒)
- timeout: 10
+ timeout: 5
# token过期时间
daysToExpire: 100
# 推送消息token
diff --git a/AutoSprout-ui/src/views/device/device/index.vue b/AutoSprout-ui/src/views/device/device/index.vue
index 5b0b734..336b82b 100644
--- a/AutoSprout-ui/src/views/device/device/index.vue
+++ b/AutoSprout-ui/src/views/device/device/index.vue
@@ -213,7 +213,7 @@
-
+
@@ -350,7 +350,7 @@ import {listDevice, getDevice, delDevice, addDevice, updateDevice, watering} fro
import {listClassify} from "@/api/device/classify";
import {listVersion} from "@/api/device/version";
import {listModel} from "@/api/device/model";
-import {listUser} from "@/api/system/user";
+import {listUser} from "@/api/user/user";
export default {
name: "Device",
diff --git a/AutoSprout-watering/src/main/java/com/ruoyi/device/controller/AsModelController.java b/AutoSprout-watering/src/main/java/com/ruoyi/device/controller/AsModelController.java
index 2b9882d..868b0f2 100644
--- a/AutoSprout-watering/src/main/java/com/ruoyi/device/controller/AsModelController.java
+++ b/AutoSprout-watering/src/main/java/com/ruoyi/device/controller/AsModelController.java
@@ -23,7 +23,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
/**
* 型号列表Controller
- *
+ *
* @author qiuzhenzhao
* @date 2023-11-11
*/
@@ -77,6 +77,10 @@ public class AsModelController extends BaseController
@PostMapping
public AjaxResult add(@RequestBody AsModel asModel)
{
+ if (!asModelService.checkModelUnique(asModel))
+ {
+ return error("新增型号'" + asModel.getModel() + "'失败,该型号已存在");
+ }
asModel.setCreateBy(getUsername());
return toAjax(asModelService.insertAsModel(asModel));
}
@@ -89,6 +93,10 @@ public class AsModelController extends BaseController
@PutMapping
public AjaxResult edit(@RequestBody AsModel asModel)
{
+ if (!asModelService.checkModelUnique(asModel))
+ {
+ return error("修改型号'" + asModel.getModel() + "'失败,该型号已存在");
+ }
return toAjax(asModelService.updateAsModel(asModel));
}
diff --git a/AutoSprout-watering/src/main/java/com/ruoyi/device/mapper/AsModelMapper.java b/AutoSprout-watering/src/main/java/com/ruoyi/device/mapper/AsModelMapper.java
index 025ec27..9f671e4 100644
--- a/AutoSprout-watering/src/main/java/com/ruoyi/device/mapper/AsModelMapper.java
+++ b/AutoSprout-watering/src/main/java/com/ruoyi/device/mapper/AsModelMapper.java
@@ -8,7 +8,7 @@ import com.ruoyi.device.domain.AsModel;
/**
* 型号列表Mapper接口
- *
+ *
* @author qiuzhenzhao
* @date 2023-11-11
*/
@@ -16,7 +16,7 @@ public interface AsModelMapper extends BaseMapper
{
/**
* 查询型号列表
- *
+ *
* @param modelId 型号列表主键
* @return 型号列表
*/
@@ -24,7 +24,7 @@ public interface AsModelMapper extends BaseMapper
/**
* 查询型号列表列表
- *
+ *
* @param asModel 型号列表
* @return 型号列表集合
*/
@@ -32,7 +32,7 @@ public interface AsModelMapper extends BaseMapper
/**
* 新增型号列表
- *
+ *
* @param asModel 型号列表
* @return 结果
*/
@@ -40,7 +40,7 @@ public interface AsModelMapper extends BaseMapper
/**
* 修改型号列表
- *
+ *
* @param asModel 型号列表
* @return 结果
*/
@@ -48,7 +48,7 @@ public interface AsModelMapper extends BaseMapper
/**
* 删除型号列表
- *
+ *
* @param modelId 型号列表主键
* @return 结果
*/
@@ -56,9 +56,17 @@ public interface AsModelMapper extends BaseMapper
/**
* 批量删除型号列表
- *
+ *
* @param modelIds 需要删除的数据主键集合
* @return 结果
*/
public int deleteAsModelByModelIds(Long[] modelIds);
+
+ /**
+ * 根据型号名称查询
+ *
+ * @param model 需要删除的数据主键集合
+ * @return 结果
+ */
+ public AsModel checkModelUnique(String model);
}
diff --git a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/IAsModelService.java b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/IAsModelService.java
index 9076110..72213c3 100644
--- a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/IAsModelService.java
+++ b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/IAsModelService.java
@@ -5,15 +5,15 @@ import com.ruoyi.device.domain.AsModel;
/**
* 型号列表Service接口
- *
+ *
* @author qiuzhenzhao
* @date 2023-11-11
*/
-public interface IAsModelService
+public interface IAsModelService
{
/**
* 查询型号列表
- *
+ *
* @param modelId 型号列表主键
* @return 型号列表
*/
@@ -21,7 +21,7 @@ public interface IAsModelService
/**
* 查询型号列表列表
- *
+ *
* @param asModel 型号列表
* @return 型号列表集合
*/
@@ -29,7 +29,7 @@ public interface IAsModelService
/**
* 新增型号列表
- *
+ *
* @param asModel 型号列表
* @return 结果
*/
@@ -37,7 +37,7 @@ public interface IAsModelService
/**
* 修改型号列表
- *
+ *
* @param asModel 型号列表
* @return 结果
*/
@@ -45,7 +45,7 @@ public interface IAsModelService
/**
* 批量删除型号列表
- *
+ *
* @param modelIds 需要删除的型号列表主键集合
* @return 结果
*/
@@ -53,9 +53,18 @@ public interface IAsModelService
/**
* 删除型号列表信息
- *
+ *
* @param modelId 型号列表主键
* @return 结果
*/
public int deleteAsModelByModelId(Long modelId);
+
+
+ /**
+ * 校验型号是否唯一
+ *
+ * @param asModel 型号信息
+ * @return 结果
+ */
+ public boolean checkModelUnique(AsModel asModel);
}
diff --git a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/IAsUserService.java b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/IAsUserService.java
index b55b08a..027a61c 100644
--- a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/IAsUserService.java
+++ b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/IAsUserService.java
@@ -1,20 +1,21 @@
package com.ruoyi.device.service;
import com.ruoyi.common.core.domain.entity.AsUser;
+import com.ruoyi.common.core.domain.onenet.DatapointValue;
import com.ruoyi.device.domain.AsDevice;
import java.util.List;
/**
* 用户 业务层
- *
+ *
* @author ruoyi
*/
public interface IAsUserService
{
/**
* 根据条件分页查询用户列表
- *
+ *
* @param user 用户信息
* @return 用户信息集合信息
*/
@@ -22,7 +23,7 @@ public interface IAsUserService
/**
* 根据条件分页查询已分配用户角色列表
- *
+ *
* @param user 用户信息
* @return 用户信息集合信息
*/
@@ -30,7 +31,7 @@ public interface IAsUserService
/**
* 根据条件分页查询未分配用户角色列表
- *
+ *
* @param user 用户信息
* @return 用户信息集合信息
*/
@@ -38,7 +39,7 @@ public interface IAsUserService
/**
* 通过用户名查询用户
- *
+ *
* @param userName 用户名
* @return 用户对象信息
*/
@@ -46,7 +47,7 @@ public interface IAsUserService
/**
* 通过用户ID查询用户
- *
+ *
* @param userId 用户ID
* @return 用户对象信息
*/
@@ -56,7 +57,7 @@ public interface IAsUserService
/**
* 校验用户名称是否唯一
- *
+ *
* @param user 用户信息
* @return 结果
*/
@@ -80,7 +81,7 @@ public interface IAsUserService
/**
* 新增用户信息
- *
+ *
* @param user 用户信息
* @return 结果
*/
@@ -88,7 +89,7 @@ public interface IAsUserService
/**
* 注册用户信息
- *
+ *
* @param user 用户信息
* @return 结果
*/
@@ -96,7 +97,7 @@ public interface IAsUserService
/**
* 修改用户信息
- *
+ *
* @param user 用户信息
* @return 结果
*/
@@ -104,7 +105,7 @@ public interface IAsUserService
/**
* 修改用户状态
- *
+ *
* @param user 用户信息
* @return 结果
*/
@@ -112,7 +113,7 @@ public interface IAsUserService
/**
* 修改用户基本信息
- *
+ *
* @param user 用户信息
* @return 结果
*/
@@ -120,7 +121,7 @@ public interface IAsUserService
/**
* 修改用户头像
- *
+ *
* @param userName 用户名
* @param avatar 头像地址
* @return 结果
@@ -129,7 +130,7 @@ public interface IAsUserService
/**
* 重置用户密码
- *
+ *
* @param user 用户信息
* @return 结果
*/
@@ -137,7 +138,7 @@ public interface IAsUserService
/**
* 重置用户密码
- *
+ *
* @param userName 用户名
* @param password 密码
* @return 结果
@@ -146,7 +147,7 @@ public interface IAsUserService
/**
* 通过用户ID删除用户
- *
+ *
* @param userId 用户ID
* @return 结果
*/
@@ -154,7 +155,7 @@ public interface IAsUserService
/**
* 批量删除用户信息
- *
+ *
* @param userIds 需要删除的用户ID
* @return 结果
*/
@@ -162,7 +163,7 @@ public interface IAsUserService
/**
* 导入用户数据
- *
+ *
* @param userList 用户数据列表
* @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
* @param operName 操作用户
@@ -182,4 +183,9 @@ public interface IAsUserService
* 根据登录用户获取是否有绑定设备
*/
List selectDeviceInfoByUser(Long userId,Long deviceId);
+
+ /**
+ * 计算下次定时时间
+ */
+ public void setNextDs(AsDevice asDevice1, DatapointValue.nextDs next_ds);
}
diff --git a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsDeviceServiceImpl.java b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsDeviceServiceImpl.java
index 9b4d82b..79c0afb 100644
--- a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsDeviceServiceImpl.java
+++ b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsDeviceServiceImpl.java
@@ -7,6 +7,7 @@ import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.constant.IotConstants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.onenet.*;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.http.HttpUtils;
@@ -15,6 +16,9 @@ import com.ruoyi.common.utils.onenet.Token;
import com.ruoyi.device.domain.*;
import com.ruoyi.device.mapper.*;
import com.ruoyi.device.service.IAsDeviceService;
+import com.ruoyi.device.service.IAsTimerService;
+import com.ruoyi.device.service.IAsUserService;
+import com.ruoyi.device.service.IAsWateringRecordService;
import com.ruoyi.system.mapper.SysUserMapper;
import lombok.SneakyThrows;
import org.apache.commons.lang3.ObjectUtils;
@@ -24,12 +28,14 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import static com.ruoyi.common.utils.SecurityUtils.getUsername;
-
/**
* 设备列表Service业务层处理
*
@@ -60,6 +66,14 @@ public class AsDeviceServiceImpl extends ServiceImpl i
@Resource
private AsWateringRecordMapper wateringRecordMapper;
+ @Resource
+ private IAsUserService asUserService;
+
+ @Resource
+ private IAsTimerService asTimerService;
+
+ @Resource
+ private IAsWateringRecordService asWateringRecordService;
@Value(value = "${watering.iotUrl}")
private String iotUrl;
@@ -84,11 +98,12 @@ public class AsDeviceServiceImpl extends ServiceImpl i
/**
- * 查询设备列表
+ * 查询设备详情
*
* @param deviceId 设备列表主键
* @return 设备列表
*/
+ @SneakyThrows
@Override
public AsDevice selectAsDeviceByDeviceId(Long deviceId)
{
@@ -96,10 +111,86 @@ public class AsDeviceServiceImpl extends ServiceImpl i
if(ObjectUtils.isEmpty(device)){
throw new ServiceException("没有找到该设备");
}
+ /** 请求onenet更新设备参数*/
+ updateDeviceParam(device);
device.setPicture(modelMapper.selectAsModelByModelId(device.getModelId()).getPicture());
return device;
}
+ /**
+ * 从onenet更新设备参数
+ *
+ * @param asDevice1 设备对象
+ * @return 设备列表
+ */
+ private void updateDeviceParam(AsDevice asDevice1) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
+ String sendUrl = iotUrl+ IotConstants.ADDS_COMMAND;
+ String token = Token.getToken();
+ String deviceName = asDevice1.getMac();//mac地址就是产品名称
+ String param = "device_name=" + deviceName + "&product_id=" + productId +"&timeout=" + timeout;
+ sendUrl = sendUrl + "?"+param;
+ String result = HttpUtils.sendPostWithToken(sendUrl, "111", token);
+ JSONObject paramsObj = JSON.parseObject(result);
+ String code = paramsObj.getString("code");
+ if (!HttpStatus.IOT_SUCCESS.equals(code)) {
+ asDevice1.setOnlineStatus("0");//在线状态:0-不在线;1-在线
+ if(ObjectUtils.isEmpty(asDevice1)){
+ throw new ServiceException("设备不在线");
+ }
+ }else{
+ asDevice1.setOnlineStatus("1");
+ // 查询onenet设备参数
+ String datapointsUrl = iotUrl+ IotConstants.ADDS_HISTORY_DATAPOINTS + "?"+param;
+ logger.info("IOT获取到Authorization:【{}】", token);
+ String result2 = HttpUtils.sendGetWithToken(datapointsUrl, null, token);
+ DataPointRes dataPointRes = JSONObject.parseObject(result2, DataPointRes.class);
+ Data data = dataPointRes.getData();
+ List datastreams = data.getDatastreams();
+ for (Datastream datastream: datastreams) {
+ if(datastream.getId().equals("jj")){
+ List datapoints = datastream.getDatapoints();
+ Datapoint datapoint = datapoints.get(0);
+ DatapointValue value = JSONObject.parseObject(datapoint.getValue().toString(), DatapointValue.class);
+ asDevice1.setWaterIntensity(value.getJiaoshui_qiangdu());
+ DatapointValue.Tr tr = value.getTr();
+ asDevice1.setSoilMoistureClose(tr.getEnd_sd());
+ asDevice1.setSoilMoistureOpen(tr.getStart_sd());
+ asDevice1.setSoilMoisture(tr.getKaiguan().toString());
+ asDevice1.setPulseModeParam(JSON.toJSONString(value.getMc()));
+ DatapointValue.nextDs next_ds = value.getNext_ds();
+ /**设置下次浇水时间日期*/
+ asUserService.setNextDs(asDevice1, next_ds);
+ /**设置浇水模式*/
+ List modeList = new ArrayList<>();
+ Boolean sw = next_ds.getSw();
+ List dsArray = value.getDsArray();
+ //清除无效定时器
+ List ds = asTimerService.cleanInvalidDs(dsArray);
+ if(sw && ds.size()>0){//如果定时器开启且定时器列表不为空
+ modeList.add("1");
+ }
+ Boolean kaiguan = tr.getKaiguan();
+ if(kaiguan){//土壤模式开关
+ modeList.add("2");
+ }
+ asDevice1.setMode(modeList);
+ asDevice1.setModeStr(JSON.toJSONString(modeList));
+ asDevice1.setCurrentSoilMoisture(value.getTuran_show());
+ List asWateringRecords = asWateringRecordService.selectAsWateringRecordList(AsWateringRecord.builder().deviceId(asDevice1.getDeviceId()).build());
+ // 根据asWateringRecords查询最后一次浇水时间
+ if(asWateringRecords.size()>0){
+ asDevice1.setLastWatering(asWateringRecords.get(0).getWaterTime());
+ }
+ /**将value转成device对象并保存到数据库*/
+ int i = asDeviceMapper.updateAsDevice(asDevice1);
+ if(i>0){
+ logger.info("保存设备参数成功:【{}】", JSON.toJSONString(asDevice1));
+ }
+ }
+ }
+ }
+ }
+
/**
* 查询设备列表列表
*
diff --git a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsModelServiceImpl.java b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsModelServiceImpl.java
index c2ceeb3..909bb1a 100644
--- a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsModelServiceImpl.java
+++ b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsModelServiceImpl.java
@@ -8,7 +8,9 @@ import java.util.List;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.device.domain.AsDevice;
import com.ruoyi.device.domain.AsDeviceClassify;
import com.ruoyi.device.domain.AsDeviceVersion;
@@ -69,12 +71,14 @@ public class AsModelServiceImpl extends ServiceImpl impl
QueryWrapper queryWrapper = Wrappers.query();
for (AsModel model: models) {
//累计激活 device表--activation_time激活时间不为null
+ queryWrapper.eq("model_id",model.getModelId());
queryWrapper.isNotNull("activation_time").ne("activation_time","");
Integer activationNum = deviceMapper.selectCount(queryWrapper);
model.setActivationNum(activationNum);
//在线率 device表--online_status为1 在线数/总数
QueryWrapper queryWrapper2 = Wrappers.query();
+ queryWrapper2.eq("model_id",model.getModelId());
queryWrapper2.eq("online_status","1");
Double onlineNum = deviceMapper.selectCount(queryWrapper2).doubleValue();
@@ -145,4 +149,22 @@ public class AsModelServiceImpl extends ServiceImpl impl
{
return asModelMapper.deleteAsModelByModelId(modelId);
}
+
+ /**
+ * 校验型号是否唯一
+ *
+ * @param asModel 型号信息
+ * @return 结果
+ */
+ @Override
+ public boolean checkModelUnique(AsModel asModel)
+ {
+ Long modelId = StringUtils.isNull(asModel.getModelId()) ? -1L : asModel.getModelId();
+ AsModel info = asModelMapper.checkModelUnique(asModel.getModel());
+ if (StringUtils.isNotNull(info) && info.getModelId().longValue() != modelId.longValue())
+ {
+ return UserConstants.NOT_UNIQUE;
+ }
+ return UserConstants.UNIQUE;
+ }
}
diff --git a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsUserServiceImpl.java b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsUserServiceImpl.java
index f5e2c19..71dbcf6 100644
--- a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsUserServiceImpl.java
+++ b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsUserServiceImpl.java
@@ -499,7 +499,7 @@ public class AsUserServiceImpl implements IAsUserService
return asDevices;
}
- private void setNextDs(AsDevice asDevice1, DatapointValue.nextDs next_ds) {
+ public void setNextDs(AsDevice asDevice1, DatapointValue.nextDs next_ds) {
//将week将10进制转成2进制
String week = Integer.toBinaryString(next_ds.getWeek());
if(StringUtils.isNotEmpty(week)){
@@ -530,6 +530,7 @@ public class AsUserServiceImpl implements IAsUserService
System.out.println("浇水时间大于当前时间,浇水时间未过");
next_ds.setDate(date);
asDevice1.setNextDs(JSON.toJSONString(next_ds));
+ break;
}else{
System.out.println("浇水时间小于当前时间,浇水时间已过");
}
diff --git a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsWateringRecordServiceImpl.java b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsWateringRecordServiceImpl.java
index c8c1e39..6b0d48f 100644
--- a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsWateringRecordServiceImpl.java
+++ b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsWateringRecordServiceImpl.java
@@ -2,6 +2,7 @@ package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.device.domain.AsWateringRecord;
import com.ruoyi.device.mapper.AsWateringRecordMapper;
import com.ruoyi.device.service.IAsWateringRecordService;
@@ -61,6 +62,9 @@ public class AsWateringRecordServiceImpl extends ServiceImpl
-
+
@@ -27,7 +27,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-
+
-
+
+
insert into as_model
@@ -102,9 +105,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- delete from as_model where model_id in
+ delete from as_model where model_id in
#{modelId}
-
\ No newline at end of file
+