diff --git a/AutoSprout-admin/src/main/java/com/ruoyi/web/controller/system/AsProfileController.java b/AutoSprout-admin/src/main/java/com/ruoyi/web/controller/system/AsProfileController.java index 2f51c0c..fdd323c 100644 --- a/AutoSprout-admin/src/main/java/com/ruoyi/web/controller/system/AsProfileController.java +++ b/AutoSprout-admin/src/main/java/com/ruoyi/web/controller/system/AsProfileController.java @@ -23,6 +23,7 @@ import com.ruoyi.framework.web.service.SysLoginService; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.service.ISysUserService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -50,6 +51,9 @@ public class AsProfileController extends BaseController @Resource private IAsDeviceService asDeviceService; + @Value(value = "${watering.defaultName}") + private String defaultName; + /** * 个人信息 */ @@ -59,8 +63,7 @@ public class AsProfileController extends BaseController LoginUser loginUser = getLoginUser(); AsUser user = loginUser.getAsUser(); AsUser asUser = asUserService.selectUserById(user.getUserId()); - AjaxResult ajax = AjaxResult.success(asUser); - return ajax; + return AjaxResult.success(asUser); } /** @@ -167,7 +170,7 @@ public class AsProfileController extends BaseController } asDevice.setModel(asModel.getModel()); asDevice.setModelName(asModel.getModelName()); - asDevice.setDeviceName("丁丁浇花器"); + asDevice.setDeviceName(defaultName); asDevice.setCreateTime(DateUtils.getNowDate()); return toAjax(asDeviceService.bandSn(asDevice)); } diff --git a/AutoSprout-admin/src/main/resources/application.yml b/AutoSprout-admin/src/main/resources/application.yml index 5dff169..d0541b9 100644 --- a/AutoSprout-admin/src/main/resources/application.yml +++ b/AutoSprout-admin/src/main/resources/application.yml @@ -33,6 +33,9 @@ watering: token: tVpNdGKrAFHfKZNgpIWQfZukrcYHNfFM # 创建设备地址 deviceUrl: https://iot-api.heclouds.com/device + # 默认名称 + defaultName: 丁丁浇花器 + # 百度植物识别 baidu: tokenUrl: https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials @@ -197,7 +200,7 @@ qiniu: # 七牛云命名空间 bucket: autosprout # 过期时间(秒) - expireSeconds: 600 + expireSeconds: 86400 # 七牛云GET请求域名 domain: https://lxnapi.ccttiot.com xinzhi: diff --git a/AutoSprout-common/src/main/java/com/ruoyi/common/utils/ServiceUtil.java b/AutoSprout-common/src/main/java/com/ruoyi/common/utils/ServiceUtil.java new file mode 100644 index 0000000..072b41b --- /dev/null +++ b/AutoSprout-common/src/main/java/com/ruoyi/common/utils/ServiceUtil.java @@ -0,0 +1,37 @@ +package com.ruoyi.common.utils; + +import com.ruoyi.common.exception.ServiceException; + +/** + * @author 辉 + * 2024/3/4 + */ +public class ServiceUtil { + + /** + * 判断是否满足条件,满足则抛出异常 + * @param flag 条件 + * @param msg 异常说明 + */ + public static void assertion(boolean flag, String msg) { + assertion(flag, msg, 500); + } + + /** + * 判断是否满足条件,满足则抛出异常 + * @param flag 条件 + * @param msg 异常说明 + * @param code 业务代码 + */ + public static void assertion(boolean flag, String msg, int code) { + if (flag) { + throw new ServiceException(msg, code); + } + } + + public static void assertion(boolean flag, String format, Object ...args) { + if (flag) { + throw new ServiceException(String.format(format, args), 500); + } + } +} diff --git a/AutoSprout-watering/src/main/java/com/ruoyi/device/app/AppController.java b/AutoSprout-watering/src/main/java/com/ruoyi/device/app/AppController.java index 34f1c06..2efb826 100644 --- a/AutoSprout-watering/src/main/java/com/ruoyi/device/app/AppController.java +++ b/AutoSprout-watering/src/main/java/com/ruoyi/device/app/AppController.java @@ -15,6 +15,7 @@ import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.common.utils.onenet.Token; import com.ruoyi.device.domain.*; import com.ruoyi.device.domain.vo.IdentifyRes; +import com.ruoyi.device.domain.vo.IsBandVO; import com.ruoyi.device.service.*; import com.ruoyi.system.service.ISysConfigService; import lombok.SneakyThrows; @@ -210,6 +211,15 @@ public class AppController extends BaseController { return success(asDeviceService.bandDevice(asDevice)); } +// +// /** +// * 根据mac判断设备是否绑定 +// */ +// @GetMapping("/isBand") +// public AjaxResult isBand(List macList) +// { +// return success(asDeviceService.isBand(macList)); +// } /** * 解绑设备 @@ -420,13 +430,15 @@ public class AppController extends BaseController Boolean collection = asUserCollectionService.isCollection(plantId, userId); return AjaxResult.success(collection); } + /** * 根据mac号查询设备是否被绑定 */ @GetMapping("/device/isBand/{mac}") - public AjaxResult isBand(@PathVariable String mac) + public AjaxResult isBand(@PathVariable List mac) { - Boolean isBand = asDeviceService.isBand(mac); + logger.info("根据mac号查询设备是否被绑定传参-----{}", JSON.toJSONString(mac)); + List isBand = asDeviceService.isBand(mac); return AjaxResult.success(isBand); } diff --git a/AutoSprout-watering/src/main/java/com/ruoyi/device/domain/vo/IsBandVO.java b/AutoSprout-watering/src/main/java/com/ruoyi/device/domain/vo/IsBandVO.java new file mode 100644 index 0000000..8cb01ab --- /dev/null +++ b/AutoSprout-watering/src/main/java/com/ruoyi/device/domain/vo/IsBandVO.java @@ -0,0 +1,13 @@ +package com.ruoyi.device.domain.vo; + +import lombok.Data; + +@Data +public class IsBandVO { + + /** 设备mac */ + private String mac; + + /** 是否绑定 */ + private Boolean isBand; +} diff --git a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/IAsDeviceService.java b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/IAsDeviceService.java index 26918f0..9415f32 100644 --- a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/IAsDeviceService.java +++ b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/IAsDeviceService.java @@ -5,6 +5,7 @@ import java.util.List; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.device.domain.AsDevice; import com.ruoyi.device.domain.AsDeviceQuery; +import com.ruoyi.device.domain.vo.IsBandVO; import com.ruoyi.device.domain.vo.WeatherResponse; /** @@ -110,7 +111,8 @@ public interface IAsDeviceService * @param mac 设备mac * @return 结果 */ - Boolean isBand(String mac); + List isBand(List mac); + /** * 切换默认展示设备 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 2907e39..7f6d775 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 @@ -10,14 +10,15 @@ import com.ruoyi.common.core.domain.entity.AsUser; import com.ruoyi.common.core.domain.onenet.*; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ServiceUtil; import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.common.utils.onenet.CreateDeviceVo; -import com.ruoyi.common.utils.onenet.IotUtil; import com.ruoyi.common.utils.onenet.Token; import com.ruoyi.common.utils.pinyin.PinyinUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.device.domain.*; import com.ruoyi.device.domain.vo.IPVo; +import com.ruoyi.device.domain.vo.IsBandVO; import com.ruoyi.device.domain.vo.WeatherResponse; import com.ruoyi.device.mapper.*; import com.ruoyi.device.service.IAsDeviceService; @@ -30,16 +31,18 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; 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.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.Resource; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -82,6 +85,9 @@ public class AsDeviceServiceImpl extends ServiceImpl i @Resource private IAsWateringRecordService asWateringRecordService; + @Autowired + private TransactionTemplate transactionTemplate; + @Value(value = "${watering.iotUrl}") private String iotUrl; @@ -106,6 +112,9 @@ public class AsDeviceServiceImpl extends ServiceImpl i @Value(value = "${watering.deviceUrl}") private String deviceUrl; + @Value(value = "${watering.defaultName}") + private String defaultName; + /** * 查询设备详情 @@ -123,7 +132,9 @@ public class AsDeviceServiceImpl extends ServiceImpl i } /** 请求onenet更新设备参数*/ updateDeviceParam(device); - device.setPicture(modelMapper.selectAsModelByModelId(device.getModelId()).getPicture()); + if(device.getModelId() != null){ + device.setPicture(modelMapper.selectAsModelByModelId(device.getModelId()).getPicture()); + } return device; } @@ -199,7 +210,7 @@ public class AsDeviceServiceImpl extends ServiceImpl i List dsArray = value.getDsArray(); //清除无效定时器 List ds = asTimerService.cleanInvalidDs(dsArray); - if(sw && ds.size()>0){//如果定时器开启且定时器列表不为空 + if(sw && !ds.isEmpty()){//如果定时器开启且定时器列表不为空 modeList.add("1"); } Boolean kaiguan = tr.getKaiguan(); @@ -211,7 +222,7 @@ public class AsDeviceServiceImpl extends ServiceImpl i asDevice1.setCurrentSoilMoisture(value.getTuran_show()); List asWateringRecords = asWateringRecordService.selectAsWateringRecordList(AsWateringRecord.builder().deviceId(asDevice1.getDeviceId()).build()); // 根据asWateringRecords查询最后一次浇水时间 - if(asWateringRecords.size()>0){ + if(!asWateringRecords.isEmpty()){ asDevice1.setLastWatering(asWateringRecords.get(0).getWaterTime()); } /**将value转成device对象并保存到数据库*/ @@ -418,17 +429,17 @@ public class AsDeviceServiceImpl extends ServiceImpl i @SneakyThrows @Override public AjaxResult watering(AsDevice device,Integer wateringSwitch) { - /** 1.拼接url */ + /* 1.拼接url */ String deviceName = device.getMac();//mac地址就是产品名称 String param = "device_name=" + deviceName + "&product_id=" + productId +"&timeout=" + timeout; String sendUrl = iotUrl+ IotConstants.ADDS_COMMAND + "?"+param; logger.info("IOT请求地址:【{}】", sendUrl); - /** 2.获取token */ + /* 2.获取token */ String token = Token.getToken(); logger.info("IOT获取到Authorization:【{}】",token); - /** 3.请求下发 */ + /* 3.请求下发 */ String command = wateringSwitch == 1 ? IotConstants.COMMAND_OPEN : IotConstants.COMMAND_CLOSE; String result = HttpUtils.sendPostWithToken(sendUrl, command, token); JSONObject paramsObj = JSON.parseObject(result); @@ -463,25 +474,31 @@ public class AsDeviceServiceImpl extends ServiceImpl i */ @Override public Boolean bandDevice(AsDevice asDevice) { - /** 根据mac号获取到设备详情*/ - String mac = asDevice.getMac(); - AsDevice device = asDeviceMapper.selectAsDeviceByMac(mac); - if(ObjectUtils.isEmpty(device)){ - throw new ServiceException("该设备不存在"); - } - if(ObjectUtils.isNotEmpty(device.getUserId()) && device.getUserId()>0){ - throw new ServiceException("该设备已经绑定用户,请先解绑!"); - } - device.setUserId(asDevice.getUserId()); - device.setBluetoothId(asDevice.getBluetoothId()); - device.setBluetoothName(asDevice.getBluetoothName()); - int i = asDeviceMapper.updateAsDevice(device); - if(i>0){ - toggleDevice(asDevice.getUserId(), device.getDeviceId()); - return true; - }else{ - return false; - } + AsDevice device = asDeviceMapper.selectAsDeviceByMac(asDevice.getMac()); + /* 根据mac号获取到设备详情*/ + Boolean execute = transactionTemplate.execute(e -> { + if(ObjectUtils.isEmpty(device)){ + asDevice.setDeviceName(defaultName); + int i = bandSn(asDevice); + ServiceUtil.assertion(i == 0, "录入失败!"); + }else{ + if(ObjectUtils.isNotEmpty(device.getUserId()) && device.getUserId()>0){ + throw new ServiceException("该设备已经绑定用户,请先解绑!"); + } + device.setUserId(asDevice.getUserId()); + device.setBluetoothId(asDevice.getBluetoothId()); + device.setBluetoothName(asDevice.getBluetoothName()); + int i = asDeviceMapper.updateAsDevice(device); + ServiceUtil.assertion(i == 0, "绑定失败!"); + + // 切换默认设备 + toggleDevice(asDevice.getUserId(), device.getDeviceId()); + } + logger.info("=================【绑定设备】成功=================="); + return Boolean.TRUE; + }); + if(Boolean.FALSE.equals(execute))throw new ServiceException("绑定失败"); + return true; } /** @@ -500,7 +517,7 @@ public class AsDeviceServiceImpl extends ServiceImpl i AsDeviceQuery asDeviceQuery = new AsDeviceQuery(); asDeviceQuery.setUserId(device2.getUserId()); List asDevices = asDeviceMapper.selectAsDeviceList(asDeviceQuery); - if(asDevices.size()>0){ + if(!asDevices.isEmpty()){ AsDevice device1 = asDevices.get(0); device1.setIsDefault("1"); asDeviceMapper.updateAsDevice(device1); @@ -530,12 +547,24 @@ public class AsDeviceServiceImpl extends ServiceImpl i * @param mac 设备mac * @return 结果 */ - @Override public Boolean isBand(String mac) { int i = asDeviceMapper.isBandByMac(mac); return i>0; } + @Override + public List isBand(List macList) { + List isBandVOS = new ArrayList<>(); + for(String mac:macList){ + IsBandVO isBandVO = new IsBandVO(); + isBandVO.setMac(mac); + isBandVO.setIsBand(isBand(mac)); + isBandVOS.add(isBandVO); + } + return isBandVOS; + } + + /** * 切换默认展示设备 @@ -547,9 +576,9 @@ public class AsDeviceServiceImpl extends ServiceImpl i asDeviceQuery.setUserId(userId); asDeviceQuery.setIsDefault("1"); List asDevices = asDeviceMapper.selectAsDeviceList(asDeviceQuery); - if(ObjectUtils.isNotEmpty(asDevices) && asDevices.size()>0){ + if(ObjectUtils.isNotEmpty(asDevices) && !asDevices.isEmpty()){ for(AsDevice device:asDevices){ - if(device.getDeviceId()!=deviceId){ + if(!Objects.equals(device.getDeviceId(), deviceId)){ asDeviceMapper.updateAsDevice(AsDevice.builder().deviceId(device.getDeviceId()).isDefault("0").build()); } } @@ -564,14 +593,14 @@ public class AsDeviceServiceImpl extends ServiceImpl i public WeatherResponse getWeather(String ipAddr) { String location = ""; if(StringUtils.isNotEmpty(ipAddr)){ - /** 获取归属地 https://opendata.baidu.com/api.php?query=36.28.139.223&co=&resource_id=6006&oe=utf8*/ + /* 获取归属地 https://opendata.baidu.com/api.php?query=36.28.139.223&co=&resource_id=6006&oe=utf8*/ String url = "https://opendata.baidu.com/api.php?query="+ ipAddr +"&co=&resource_id=6006&oe=utf8"; String sendGet = HttpUtils.sendGet(url); logger.info("获取到ip响应:【{}】",sendGet); IPVo vo = JSONObject.parseObject(sendGet,IPVo.class); logger.info("转换成IPVo对象:【{}】",JSON.toJSONString(vo)); List ipData = vo.getData(); - if(ObjectUtils.isNotEmpty(ipData) && ipData.size()>0){ + if(ObjectUtils.isNotEmpty(ipData) && !ipData.isEmpty()){ IPVo.IpData ip = ipData.get(0); String locationStr = ip.getLocation(); //将location中去掉'电信','联通','移动'字符串后去掉空格,再将字符串中的省份去掉,再将字符串中的市去掉 diff --git a/AutoSprout-watering/src/main/resources/mapper/device/AsDeviceMapper.xml b/AutoSprout-watering/src/main/resources/mapper/device/AsDeviceMapper.xml index 07e51bf..497e276 100644 --- a/AutoSprout-watering/src/main/resources/mapper/device/AsDeviceMapper.xml +++ b/AutoSprout-watering/src/main/resources/mapper/device/AsDeviceMapper.xml @@ -85,7 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"