Compare commits
8 Commits
f7a82ef138
...
jingquan
Author | SHA1 | Date | |
---|---|---|---|
fcbde4322d | |||
832234269d | |||
7e87971c0b | |||
ebd8668178 | |||
5e3307d2b0 | |||
040e44984e | |||
395b2957c1 | |||
64a4485ced |
@ -5,6 +5,7 @@ import cn.hutool.core.util.RandomUtil;
|
|||||||
import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
||||||
import com.fuyuanshen.app.domain.vo.AppDeviceShareDetailVo;
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareDetailVo;
|
||||||
import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
||||||
|
import com.fuyuanshen.app.service.AppDeviceShareService;
|
||||||
import com.fuyuanshen.app.service.IAppDeviceShareService;
|
import com.fuyuanshen.app.service.IAppDeviceShareService;
|
||||||
import com.fuyuanshen.common.core.constant.Constants;
|
import com.fuyuanshen.common.core.constant.Constants;
|
||||||
import com.fuyuanshen.common.core.domain.R;
|
import com.fuyuanshen.common.core.domain.R;
|
||||||
@ -45,7 +46,7 @@ public class AppDeviceShareController extends BaseController {
|
|||||||
|
|
||||||
private final IAppDeviceShareService deviceShareService;
|
private final IAppDeviceShareService deviceShareService;
|
||||||
|
|
||||||
private final DeviceShareService appDeviceShareService;
|
private final AppDeviceShareService appDeviceShareService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分享管理列表
|
* 分享管理列表
|
||||||
|
@ -0,0 +1,119 @@
|
|||||||
|
package com.fuyuanshen.app.controller.device;
|
||||||
|
|
||||||
|
import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo;
|
||||||
|
import com.fuyuanshen.app.domain.dto.AppDeviceLogoUploadDto;
|
||||||
|
import com.fuyuanshen.app.domain.dto.DeviceInstructDto;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppDeviceDetailVo;
|
||||||
|
import com.fuyuanshen.common.core.domain.R;
|
||||||
|
import com.fuyuanshen.common.core.validate.AddGroup;
|
||||||
|
import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessAnnotation;
|
||||||
|
import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessBatcAnnotation;
|
||||||
|
import com.fuyuanshen.common.web.core.BaseController;
|
||||||
|
import com.fuyuanshen.equipment.domain.dto.AppDeviceSendMsgBo;
|
||||||
|
import com.fuyuanshen.web.service.device.DeviceBJQBizService;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HBY210设备控制类
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/app/hby/device")
|
||||||
|
public class AppDeviceHBYController extends BaseController {
|
||||||
|
|
||||||
|
private final DeviceBJQBizService appDeviceService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取设备详细信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
*/
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public R<AppDeviceDetailVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return R.ok(appDeviceService.getInfo(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 人员信息登记
|
||||||
|
*/
|
||||||
|
@PostMapping(value = "/registerPersonInfo")
|
||||||
|
// @FunctionAccessAnnotation("registerPersonInfo")
|
||||||
|
public R<Void> registerPersonInfo(@Validated(AddGroup.class) @RequestBody AppPersonnelInfoBo bo) {
|
||||||
|
return toAjax(appDeviceService.registerPersonInfo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送信息
|
||||||
|
*/
|
||||||
|
@PostMapping(value = "/sendMessage")
|
||||||
|
@FunctionAccessBatcAnnotation(value = "sendMessage", timeOut = 30, batchMaxTimeOut = 40)
|
||||||
|
public R<Void> sendMessage(@RequestBody AppDeviceSendMsgBo bo) {
|
||||||
|
return toAjax(appDeviceService.sendMessage(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送报警信息
|
||||||
|
*/
|
||||||
|
@PostMapping(value = "/sendAlarmMessage")
|
||||||
|
@FunctionAccessBatcAnnotation(value = "sendAlarmMessage", timeOut = 5, batchMaxTimeOut = 10)
|
||||||
|
public R<Void> sendAlarmMessage(@RequestBody AppDeviceSendMsgBo bo) {
|
||||||
|
return toAjax(appDeviceService.sendAlarmMessage(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上传设备logo图片
|
||||||
|
*/
|
||||||
|
@PostMapping("/uploadLogo")
|
||||||
|
@FunctionAccessAnnotation("uploadLogo")
|
||||||
|
public R<Void> upload(@Validated @ModelAttribute AppDeviceLogoUploadDto bo) {
|
||||||
|
|
||||||
|
MultipartFile file = bo.getFile();
|
||||||
|
if(file.getSize()>1024*1024*2){
|
||||||
|
return R.warn("图片不能大于2M");
|
||||||
|
}
|
||||||
|
appDeviceService.uploadDeviceLogo(bo);
|
||||||
|
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 灯光模式
|
||||||
|
* 0(关灯),1(强光模式),2(弱光模式), 3(爆闪模式), 4(泛光模式)
|
||||||
|
*/
|
||||||
|
// @FunctionAccessAnnotation("lightModeSettings")
|
||||||
|
@PostMapping("/lightModeSettings")
|
||||||
|
public R<Void> lightModeSettings(@RequestBody DeviceInstructDto params) {
|
||||||
|
// params 转 JSONObject
|
||||||
|
appDeviceService.lightModeSettings(params);
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 灯光亮度设置
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
// @FunctionAccessAnnotation("lightBrightnessSettings")
|
||||||
|
@PostMapping("/lightBrightnessSettings")
|
||||||
|
public R<Void> lightBrightnessSettings(@RequestBody DeviceInstructDto params) {
|
||||||
|
appDeviceService.lightBrightnessSettings(params);
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 激光模式设置
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@PostMapping("/laserModeSettings")
|
||||||
|
// @FunctionAccessAnnotation("laserModeSettings")
|
||||||
|
public R<Void> laserModeSettings(@RequestBody DeviceInstructDto params) {
|
||||||
|
appDeviceService.laserModeSettings(params);
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -83,7 +83,7 @@ public class AppDeviceXinghanController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SOS档位
|
* SOS档位s
|
||||||
* SOS档位,2,1,0, 分别表示红蓝模式/爆闪模式/关闭
|
* SOS档位,2,1,0, 分别表示红蓝模式/爆闪模式/关闭
|
||||||
*/
|
*/
|
||||||
@PostMapping("/SOSGradeSettings")
|
@PostMapping("/SOSGradeSettings")
|
||||||
|
@ -0,0 +1,262 @@
|
|||||||
|
package com.fuyuanshen.app.service;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.fuyuanshen.app.domain.AppDeviceShare;
|
||||||
|
import com.fuyuanshen.app.domain.AppPersonnelInfo;
|
||||||
|
import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareDetailVo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppPersonnelInfoVo;
|
||||||
|
import com.fuyuanshen.app.mapper.AppDeviceShareMapper;
|
||||||
|
import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper;
|
||||||
|
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
||||||
|
import com.fuyuanshen.common.core.exception.ServiceException;
|
||||||
|
import com.fuyuanshen.common.core.utils.StringUtils;
|
||||||
|
import com.fuyuanshen.common.mybatis.core.page.PageQuery;
|
||||||
|
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import com.fuyuanshen.common.redis.utils.RedisUtils;
|
||||||
|
import com.fuyuanshen.common.satoken.utils.AppLoginHelper;
|
||||||
|
import com.fuyuanshen.equipment.domain.Device;
|
||||||
|
import com.fuyuanshen.equipment.domain.DeviceType;
|
||||||
|
import com.fuyuanshen.equipment.mapper.DeviceMapper;
|
||||||
|
import com.fuyuanshen.equipment.mapper.DeviceTypeMapper;
|
||||||
|
import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static com.fuyuanshen.common.core.constant.GlobalConstants.GLOBAL_REDIS_KEY;
|
||||||
|
import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.*;
|
||||||
|
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class AppDeviceShareService {
|
||||||
|
|
||||||
|
private final AppDeviceShareMapper appDeviceShareMapper;
|
||||||
|
|
||||||
|
private final DeviceMapper deviceMapper;
|
||||||
|
|
||||||
|
private final DeviceTypeMapper deviceTypeMapper;
|
||||||
|
|
||||||
|
private final AppPersonnelInfoMapper appPersonnelInfoMapper;
|
||||||
|
|
||||||
|
public TableDataInfo<AppDeviceShareVo> queryPageList(AppDeviceShareBo bo, PageQuery pageQuery) {
|
||||||
|
Long userId = AppLoginHelper.getUserId();
|
||||||
|
bo.setCreateBy(userId);
|
||||||
|
Page<AppDeviceShareVo> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||||
|
Page<AppDeviceShareVo> result = appDeviceShareMapper.selectAppDeviceShareList(bo, page);
|
||||||
|
List<AppDeviceShareVo> records = result.getRecords();
|
||||||
|
records.forEach(AppDeviceShareService::buildDeviceStatus);
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TableDataInfo<AppDeviceShareVo> queryWebPageList(AppDeviceShareBo bo, PageQuery pageQuery) {
|
||||||
|
// Long userId = AppLoginHelper.getUserId();
|
||||||
|
// bo.setCreateBy(userId);
|
||||||
|
Page<AppDeviceShareVo> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||||
|
Page<AppDeviceShareVo> result = appDeviceShareMapper.selectWebDeviceShareList(bo, page);
|
||||||
|
List<AppDeviceShareVo> records = result.getRecords();
|
||||||
|
records.forEach(AppDeviceShareService::buildDeviceStatus);
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void buildDeviceStatus(AppDeviceShareVo item) {
|
||||||
|
// 设备在线状态
|
||||||
|
String onlineStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + item.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX);
|
||||||
|
if (StringUtils.isNotBlank(onlineStatus)) {
|
||||||
|
|
||||||
|
item.setOnlineStatus(1);
|
||||||
|
} else {
|
||||||
|
item.setOnlineStatus(0);
|
||||||
|
}
|
||||||
|
String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + item.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX);
|
||||||
|
// 获取电量
|
||||||
|
if (StringUtils.isNotBlank(deviceStatus)) {
|
||||||
|
JSONObject jsonObject = JSONObject.parseObject(deviceStatus);
|
||||||
|
item.setBattery(jsonObject.getString("batteryPercentage"));
|
||||||
|
} else {
|
||||||
|
item.setBattery("0");
|
||||||
|
}
|
||||||
|
|
||||||
|
String location = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + item.getDeviceImei() + DEVICE_LOCATION_KEY_PREFIX);
|
||||||
|
if (StringUtils.isNotBlank(location)) {
|
||||||
|
JSONObject jsonObject = JSONObject.parseObject(location);
|
||||||
|
item.setLatitude(jsonObject.getString("latitude"));
|
||||||
|
item.setLongitude(jsonObject.getString("longitude"));
|
||||||
|
}
|
||||||
|
|
||||||
|
String alarmStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + item.getDeviceImei() + DEVICE_ALARM_KEY_PREFIX);
|
||||||
|
if (StringUtils.isNotBlank(alarmStatus)) {
|
||||||
|
item.setAlarmStatus(alarmStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppDeviceShareDetailVo getInfo(Long id) {
|
||||||
|
|
||||||
|
LambdaQueryWrapper<AppDeviceShare> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.eq(AppDeviceShare::getId, id);
|
||||||
|
List<AppDeviceShareVo> appDeviceShareVos = appDeviceShareMapper.selectVoList(queryWrapper);
|
||||||
|
if (appDeviceShareVos == null || appDeviceShareVos.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
AppDeviceShareVo shareVo = appDeviceShareVos.get(0);
|
||||||
|
AppDeviceShareDetailVo shareDetailVo = new AppDeviceShareDetailVo();
|
||||||
|
shareDetailVo.setId(shareVo.getId());
|
||||||
|
shareDetailVo.setDeviceId(shareVo.getDeviceId());
|
||||||
|
shareDetailVo.setPhonenumber(shareVo.getPhonenumber());
|
||||||
|
shareDetailVo.setPermission(shareVo.getPermission());
|
||||||
|
|
||||||
|
Device device = deviceMapper.selectById(shareVo.getDeviceId());
|
||||||
|
shareDetailVo.setDeviceName(device.getDeviceName());
|
||||||
|
shareDetailVo.setDeviceImei(device.getDeviceImei());
|
||||||
|
shareDetailVo.setDeviceMac(device.getDeviceMac());
|
||||||
|
|
||||||
|
DeviceType deviceType = deviceTypeMapper.selectById(device.getDeviceType());
|
||||||
|
if (deviceType != null) {
|
||||||
|
shareDetailVo.setCommunicationMode(Integer.valueOf(deviceType.getCommunicationMode()));
|
||||||
|
}
|
||||||
|
shareDetailVo.setDevicePic(device.getDevicePic());
|
||||||
|
shareDetailVo.setTypeName(deviceType.getTypeName());
|
||||||
|
shareDetailVo.setBluetoothName(device.getBluetoothName());
|
||||||
|
shareDetailVo.setDeviceStatus(device.getDeviceStatus());
|
||||||
|
shareDetailVo.setSendMsg(device.getSendMsg());
|
||||||
|
|
||||||
|
LambdaQueryWrapper<AppPersonnelInfo> qw = new LambdaQueryWrapper<>();
|
||||||
|
qw.eq(AppPersonnelInfo::getDeviceId, device.getId());
|
||||||
|
List<AppPersonnelInfoVo> appPersonnelInfoVos = appPersonnelInfoMapper.selectVoList(qw);
|
||||||
|
if (appPersonnelInfoVos != null && !appPersonnelInfoVos.isEmpty()) {
|
||||||
|
shareDetailVo.setPersonnelInfo(appPersonnelInfoVos.get(0));
|
||||||
|
}
|
||||||
|
// 设备在线状态
|
||||||
|
String onlineStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX);
|
||||||
|
if (StringUtils.isNotBlank(onlineStatus)) {
|
||||||
|
shareDetailVo.setOnlineStatus(1);
|
||||||
|
} else {
|
||||||
|
shareDetailVo.setOnlineStatus(0);
|
||||||
|
}
|
||||||
|
String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_STATUS_KEY_PREFIX);
|
||||||
|
// 获取电量
|
||||||
|
if (StringUtils.isNotBlank(deviceStatus)) {
|
||||||
|
JSONObject jsonObject = JSONObject.parseObject(deviceStatus);
|
||||||
|
shareDetailVo.setMainLightMode(jsonObject.getString("mainLightMode"));
|
||||||
|
shareDetailVo.setLaserLightMode(jsonObject.getString("laserLightMode"));
|
||||||
|
shareDetailVo.setBatteryPercentage(jsonObject.getString("batteryPercentage"));
|
||||||
|
shareDetailVo.setChargeState(jsonObject.getString("chargeState"));
|
||||||
|
shareDetailVo.setBatteryRemainingTime(jsonObject.getString("batteryRemainingTime"));
|
||||||
|
} else {
|
||||||
|
shareDetailVo.setBatteryPercentage("0");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取经度纬度
|
||||||
|
String locationKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_LOCATION_KEY_PREFIX;
|
||||||
|
String locationInfo = RedisUtils.getCacheObject(locationKey);
|
||||||
|
if (StringUtils.isNotBlank(locationInfo)) {
|
||||||
|
JSONObject jsonObject = JSONObject.parseObject(locationInfo);
|
||||||
|
shareDetailVo.setLongitude(jsonObject.get("longitude").toString());
|
||||||
|
shareDetailVo.setLatitude(jsonObject.get("latitude").toString());
|
||||||
|
shareDetailVo.setAddress((String) jsonObject.get("address"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
String alarmStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DEVICE_ALARM_KEY_PREFIX);
|
||||||
|
if (StringUtils.isNotBlank(alarmStatus)) {
|
||||||
|
shareDetailVo.setAlarmStatus(alarmStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
String lightBrightness = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DEVICE_LIGHT_BRIGHTNESS_KEY_PREFIX);
|
||||||
|
if (StringUtils.isNotBlank(lightBrightness)) {
|
||||||
|
shareDetailVo.setLightBrightness(lightBrightness);
|
||||||
|
}
|
||||||
|
|
||||||
|
return shareDetailVo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验短信验证码
|
||||||
|
*/
|
||||||
|
private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) {
|
||||||
|
String code = RedisUtils.getCacheObject(GlobalConstants.DEVICE_SHARE_CODES_KEY + phonenumber);
|
||||||
|
if (StringUtils.isBlank(code)) {
|
||||||
|
throw new ServiceException("验证码失效");
|
||||||
|
}
|
||||||
|
return code.equals(smsCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int deviceShare(AppDeviceShareBo bo) {
|
||||||
|
boolean flag = validateSmsCode(AppLoginHelper.getTenantId(), bo.getPhonenumber(), bo.getSmsCode());
|
||||||
|
if (!flag) {
|
||||||
|
throw new ServiceException("验证码错误");
|
||||||
|
}
|
||||||
|
|
||||||
|
Device device = deviceMapper.selectById(bo.getDeviceId());
|
||||||
|
if (device == null) {
|
||||||
|
throw new ServiceException("设备不存在");
|
||||||
|
}
|
||||||
|
Long userId = AppLoginHelper.getUserId();
|
||||||
|
LambdaQueryWrapper<AppDeviceShare> lqw = new LambdaQueryWrapper<>();
|
||||||
|
lqw.eq(AppDeviceShare::getDeviceId, bo.getDeviceId());
|
||||||
|
lqw.eq(AppDeviceShare::getPhonenumber, bo.getPhonenumber());
|
||||||
|
Long count = appDeviceShareMapper.selectCount(lqw);
|
||||||
|
if (count > 0) {
|
||||||
|
|
||||||
|
UpdateWrapper<AppDeviceShare> uw = new UpdateWrapper<>();
|
||||||
|
uw.eq("device_id", bo.getDeviceId());
|
||||||
|
uw.eq("phonenumber", bo.getPhonenumber());
|
||||||
|
uw.set("permission", bo.getPermission());
|
||||||
|
uw.set("update_by", userId);
|
||||||
|
uw.set("update_time", new Date());
|
||||||
|
|
||||||
|
return appDeviceShareMapper.update(uw);
|
||||||
|
} else {
|
||||||
|
AppDeviceShare appDeviceShare = new AppDeviceShare();
|
||||||
|
appDeviceShare.setDeviceId(bo.getDeviceId());
|
||||||
|
appDeviceShare.setPhonenumber(bo.getPhonenumber());
|
||||||
|
appDeviceShare.setPermission(bo.getPermission());
|
||||||
|
appDeviceShare.setCreateBy(userId);
|
||||||
|
return appDeviceShareMapper.insert(appDeviceShare);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int remove(Long[] ids) {
|
||||||
|
return appDeviceShareMapper.deleteByIds(Arrays.asList(ids));
|
||||||
|
}
|
||||||
|
|
||||||
|
public TableDataInfo<AppDeviceShareVo> otherDeviceShareList(AppDeviceShareBo bo, PageQuery pageQuery) {
|
||||||
|
String username = AppLoginHelper.getUsername();
|
||||||
|
bo.setPhonenumber(username);
|
||||||
|
Page<AppDeviceShareVo> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||||
|
IPage<AppDeviceShareVo> result = appDeviceShareMapper.otherDeviceShareList(bo, page);
|
||||||
|
List<AppDeviceShareVo> records = result.getRecords();
|
||||||
|
|
||||||
|
records.forEach(AppDeviceShareService::buildDeviceStatus);
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询设备分享列表(web)
|
||||||
|
*
|
||||||
|
* @param bo
|
||||||
|
* @param pageQuery
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public TableDataInfo<AppDeviceShareVo> queryWebList(AppDeviceShareBo bo, PageQuery pageQuery) {
|
||||||
|
Page<AppDeviceShareVo> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||||
|
Page<AppDeviceShareVo> result = appDeviceShareMapper.selectWebDeviceShareList(bo, page);
|
||||||
|
List<AppDeviceShareVo> records = result.getRecords();
|
||||||
|
records.forEach(AppDeviceShareService::buildDeviceStatus);
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,9 @@
|
|||||||
package com.fuyuanshen.global.mqtt.listener;
|
package com.fuyuanshen.global.mqtt.listener;
|
||||||
|
|
||||||
|
import cn.hutool.core.thread.ThreadUtil;
|
||||||
|
import com.baomidou.lock.LockInfo;
|
||||||
|
import com.baomidou.lock.LockTemplate;
|
||||||
|
import com.baomidou.lock.executor.RedissonLockExecutor;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
||||||
import com.fuyuanshen.common.redis.utils.RedisUtils;
|
import com.fuyuanshen.common.redis.utils.RedisUtils;
|
||||||
@ -32,6 +36,9 @@ public class RedisKeyExpirationListener implements MessageListener {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private DeviceMapper deviceMapper;
|
private DeviceMapper deviceMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private LockTemplate lockTemplate;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onMessage(Message message, byte[] pattern) {
|
public void onMessage(Message message, byte[] pattern) {
|
||||||
String expiredKey = new String(message.getBody());
|
String expiredKey = new String(message.getBody());
|
||||||
@ -40,16 +47,43 @@ public class RedisKeyExpirationListener implements MessageListener {
|
|||||||
String element = expiredKey.substring(FUNCTION_ACCESS_KEY.length());
|
String element = expiredKey.substring(FUNCTION_ACCESS_KEY.length());
|
||||||
handleFunctionAccessExpired(element);
|
handleFunctionAccessExpired(element);
|
||||||
}
|
}
|
||||||
if(expiredKey.endsWith(DEVICE_ONLINE_STATUS_KEY_PREFIX)){
|
if(expiredKey.endsWith(DEVICE_ONLINE_STATUS_KEY_PREFIX)) {
|
||||||
|
// threadPoolTaskExecutor.execute(() -> {
|
||||||
|
// log.info("设备离线:{}", expiredKey);
|
||||||
|
// String element = expiredKey.substring(GlobalConstants.GLOBAL_REDIS_KEY.length() + DEVICE_KEY_PREFIX.length(), expiredKey.length() - DEVICE_ONLINE_STATUS_KEY_PREFIX.length());
|
||||||
|
// UpdateWrapper<Device> deviceUpdateWrapper = new UpdateWrapper<>();
|
||||||
|
// deviceUpdateWrapper.eq("device_imei", element);
|
||||||
|
// deviceUpdateWrapper.set("online_status", 0);
|
||||||
|
// deviceMapper.update(deviceUpdateWrapper);
|
||||||
|
// });
|
||||||
|
|
||||||
threadPoolTaskExecutor.execute(() -> {
|
threadPoolTaskExecutor.execute(() -> {
|
||||||
log.info("设备离线:{}", expiredKey);
|
log.info("设备离线:{}", expiredKey);
|
||||||
String element = expiredKey.substring(GlobalConstants.GLOBAL_REDIS_KEY.length() + DEVICE_KEY_PREFIX.length(), expiredKey.length() - DEVICE_ONLINE_STATUS_KEY_PREFIX.length());
|
String element = expiredKey.substring(GlobalConstants.GLOBAL_REDIS_KEY.length() + DEVICE_KEY_PREFIX.length(), expiredKey.length() - DEVICE_ONLINE_STATUS_KEY_PREFIX.length());
|
||||||
UpdateWrapper<Device> deviceUpdateWrapper = new UpdateWrapper<>();
|
|
||||||
deviceUpdateWrapper.eq("device_imei", element);
|
// 构造设备锁键
|
||||||
deviceUpdateWrapper.set("online_status", 0);
|
String deviceLockKey = GlobalConstants.GLOBAL_REDIS_KEY + ":device_lock:" + element;
|
||||||
deviceMapper.update(deviceUpdateWrapper);
|
|
||||||
|
// 尝试获取Redis锁
|
||||||
|
LockInfo lockInfo = lockTemplate.lock(deviceLockKey, 30000L, 5000L, RedissonLockExecutor.class); // 30秒过期
|
||||||
|
|
||||||
|
if (lockInfo != null) {
|
||||||
|
try {
|
||||||
|
UpdateWrapper<Device> deviceUpdateWrapper = new UpdateWrapper<>();
|
||||||
|
deviceUpdateWrapper.eq("device_imei", element);
|
||||||
|
deviceUpdateWrapper.set("online_status", 0);
|
||||||
|
deviceMapper.update(deviceUpdateWrapper);
|
||||||
|
} finally {
|
||||||
|
//释放锁
|
||||||
|
lockTemplate.releaseLock(lockInfo);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.warn("无法获取设备锁,跳过设备离线处理: {}", element);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 访问key过期事件
|
* 访问key过期事件
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package com.fuyuanshen.global.queue;
|
package com.fuyuanshen.global.queue;
|
||||||
|
|
||||||
|
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
||||||
|
|
||||||
public class MqttMessageQueueConstants {
|
public class MqttMessageQueueConstants {
|
||||||
public static final String MQTT_MESSAGE_QUEUE_KEY = "mqtt:message:queue";
|
public static final String MQTT_MESSAGE_QUEUE_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "mqtt:message:queue";
|
||||||
public static final String MQTT_MESSAGE_DEDUP_KEY = "mqtt:message:dedup";
|
public static final String MQTT_MESSAGE_DEDUP_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "mqtt:message:dedup";
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,33 @@
|
|||||||
package com.fuyuanshen.web.controller.device;
|
package com.fuyuanshen.web.controller.device;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import cn.hutool.core.util.RandomUtil;
|
||||||
import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
||||||
import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
||||||
|
import com.fuyuanshen.common.core.constant.Constants;
|
||||||
import com.fuyuanshen.common.core.domain.R;
|
import com.fuyuanshen.common.core.domain.R;
|
||||||
import com.fuyuanshen.common.core.validate.AddGroup;
|
import com.fuyuanshen.common.core.validate.AddGroup;
|
||||||
import com.fuyuanshen.common.idempotent.annotation.RepeatSubmit;
|
import com.fuyuanshen.common.idempotent.annotation.RepeatSubmit;
|
||||||
import com.fuyuanshen.common.mybatis.core.page.PageQuery;
|
import com.fuyuanshen.common.mybatis.core.page.PageQuery;
|
||||||
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import com.fuyuanshen.common.ratelimiter.annotation.RateLimiter;
|
||||||
|
import com.fuyuanshen.common.redis.utils.RedisUtils;
|
||||||
import com.fuyuanshen.common.web.core.BaseController;
|
import com.fuyuanshen.common.web.core.BaseController;
|
||||||
import com.fuyuanshen.web.service.DeviceShareService;
|
import com.fuyuanshen.web.service.DeviceShareService;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.dromara.sms4j.api.SmsBlend;
|
||||||
|
import org.dromara.sms4j.api.entity.SmsResponse;
|
||||||
|
import org.dromara.sms4j.core.factory.SmsFactory;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
|
import static com.fuyuanshen.common.core.constant.GlobalConstants.DEVICE_SHARE_CODES_KEY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设备分享管理
|
* 设备分享管理
|
||||||
*
|
*
|
||||||
@ -25,16 +40,15 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
@RequestMapping("api/equipment/share")
|
@RequestMapping("api/equipment/share")
|
||||||
public class DeviceShareController extends BaseController {
|
public class DeviceShareController extends BaseController {
|
||||||
|
|
||||||
private final DeviceShareService appDeviceShareService;
|
private final DeviceShareService deviceShareService;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*查询设备分享列表(web)
|
* 分享管理列表
|
||||||
*/
|
*/
|
||||||
// @SaCheckPermission("equipment:alarm:list")
|
@GetMapping("/deviceShareList")
|
||||||
@GetMapping("/list")
|
|
||||||
public TableDataInfo<AppDeviceShareVo> list(AppDeviceShareBo bo, PageQuery pageQuery) {
|
public TableDataInfo<AppDeviceShareVo> list(AppDeviceShareBo bo, PageQuery pageQuery) {
|
||||||
return appDeviceShareService.queryWebList(bo, pageQuery);
|
return deviceShareService.queryWebPageList(bo, pageQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -44,7 +58,48 @@ public class DeviceShareController extends BaseController {
|
|||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@PostMapping("/deviceShare")
|
@PostMapping("/deviceShare")
|
||||||
public R<Void> deviceShare(@Validated(AddGroup.class) @RequestBody AppDeviceShareBo bo) {
|
public R<Void> deviceShare(@Validated(AddGroup.class) @RequestBody AppDeviceShareBo bo) {
|
||||||
return toAjax(appDeviceShareService.deviceShare(bo));
|
return toAjax(deviceShareService.deviceShare(bo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 权限管理
|
||||||
|
*/
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping("/permission")
|
||||||
|
public R<Void> permission(@Validated(AddGroup.class) @RequestBody AppDeviceShareBo bo) {
|
||||||
|
return toAjax(deviceShareService.deviceShare(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移除分享用户
|
||||||
|
*
|
||||||
|
* @param ids 主键串
|
||||||
|
*/
|
||||||
|
@DeleteMapping("/{ids}")
|
||||||
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
@PathVariable Long[] ids) {
|
||||||
|
return toAjax(deviceShareService.remove(ids));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短信验证码
|
||||||
|
*
|
||||||
|
* @param phonenumber 用户手机号
|
||||||
|
*/
|
||||||
|
@SaIgnore
|
||||||
|
@RateLimiter(key = "#phonenumber", time = 60, count = 1)
|
||||||
|
@GetMapping("/sms/code")
|
||||||
|
public R<Void> smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
|
||||||
|
String key = DEVICE_SHARE_CODES_KEY + phonenumber;
|
||||||
|
String code = RandomUtil.randomNumbers(4);
|
||||||
|
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
|
||||||
|
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
|
||||||
|
map.put("code", code);
|
||||||
|
SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
|
||||||
|
SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, map);
|
||||||
|
if (!smsResponse.isSuccess()) {
|
||||||
|
return R.fail(smsResponse.getData().toString());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,13 +61,15 @@ public class HomePageController {
|
|||||||
/**
|
/**
|
||||||
* 获取设备使用数据
|
* 获取设备使用数据
|
||||||
*
|
*
|
||||||
* @param deviceId 设备ID
|
* @param deviceTypeId 设备ID (可选)
|
||||||
* @param range 时间范围 1:半年 2:一年
|
* @param range 时间范围 1:半年 2:一年
|
||||||
* @return 每月使用数据列表
|
* @return 每月使用数据列表
|
||||||
*/
|
*/
|
||||||
@GetMapping("/getEquipmentUsageData/{deviceId}/{range}")
|
@GetMapping("/getEquipmentUsageData/{range}")
|
||||||
public R<List<Map<String, Object>>> getEquipmentUsageData(@PathVariable Long deviceId, @PathVariable Integer range) {
|
public R<List<Map<String, Object>>> getEquipmentUsageData(@PathVariable Integer range,
|
||||||
return R.ok(deviceService.getEquipmentUsageData(deviceId, range));
|
@RequestParam(required = false) Long deviceTypeId) {
|
||||||
|
return R.ok(deviceService.getEquipmentUsageData(deviceTypeId, range));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,15 +2,18 @@ package com.fuyuanshen.web.service;
|
|||||||
|
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.fuyuanshen.app.domain.AppDeviceBindRecord;
|
||||||
import com.fuyuanshen.app.domain.AppDeviceShare;
|
import com.fuyuanshen.app.domain.AppDeviceShare;
|
||||||
import com.fuyuanshen.app.domain.AppPersonnelInfo;
|
import com.fuyuanshen.app.domain.AppPersonnelInfo;
|
||||||
import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
||||||
import com.fuyuanshen.app.domain.vo.AppDeviceShareDetailVo;
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareDetailVo;
|
||||||
import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
||||||
import com.fuyuanshen.app.domain.vo.AppPersonnelInfoVo;
|
import com.fuyuanshen.app.domain.vo.AppPersonnelInfoVo;
|
||||||
|
import com.fuyuanshen.app.mapper.AppDeviceBindRecordMapper;
|
||||||
import com.fuyuanshen.app.mapper.AppDeviceShareMapper;
|
import com.fuyuanshen.app.mapper.AppDeviceShareMapper;
|
||||||
import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper;
|
import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper;
|
||||||
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
||||||
@ -50,6 +53,8 @@ public class DeviceShareService {
|
|||||||
|
|
||||||
private final AppPersonnelInfoMapper appPersonnelInfoMapper;
|
private final AppPersonnelInfoMapper appPersonnelInfoMapper;
|
||||||
|
|
||||||
|
private final AppDeviceBindRecordMapper appDeviceBindRecordMapper;
|
||||||
|
|
||||||
public TableDataInfo<AppDeviceShareVo> queryPageList(AppDeviceShareBo bo, PageQuery pageQuery) {
|
public TableDataInfo<AppDeviceShareVo> queryPageList(AppDeviceShareBo bo, PageQuery pageQuery) {
|
||||||
Long userId = AppLoginHelper.getUserId();
|
Long userId = AppLoginHelper.getUserId();
|
||||||
bo.setCreateBy(userId);
|
bo.setCreateBy(userId);
|
||||||
@ -60,6 +65,16 @@ public class DeviceShareService {
|
|||||||
return TableDataInfo.build(result);
|
return TableDataInfo.build(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TableDataInfo<AppDeviceShareVo> queryWebPageList(AppDeviceShareBo bo, PageQuery pageQuery) {
|
||||||
|
// Long userId = AppLoginHelper.getUserId();
|
||||||
|
// bo.setCreateBy(userId);
|
||||||
|
Page<AppDeviceShareVo> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||||
|
Page<AppDeviceShareVo> result = appDeviceShareMapper.selectWebDeviceShareList(bo, page);
|
||||||
|
List<AppDeviceShareVo> records = result.getRecords();
|
||||||
|
records.forEach(DeviceShareService::buildDeviceStatus);
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
|
||||||
private static void buildDeviceStatus(AppDeviceShareVo item) {
|
private static void buildDeviceStatus(AppDeviceShareVo item) {
|
||||||
// 设备在线状态
|
// 设备在线状态
|
||||||
String onlineStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + item.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX);
|
String onlineStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + item.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX);
|
||||||
@ -175,7 +190,7 @@ public class DeviceShareService {
|
|||||||
/**
|
/**
|
||||||
* 校验短信验证码
|
* 校验短信验证码
|
||||||
*/
|
*/
|
||||||
private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) {
|
private boolean validateSmsCode(String phonenumber, String smsCode) {
|
||||||
String code = RedisUtils.getCacheObject(GlobalConstants.DEVICE_SHARE_CODES_KEY + phonenumber);
|
String code = RedisUtils.getCacheObject(GlobalConstants.DEVICE_SHARE_CODES_KEY + phonenumber);
|
||||||
if (StringUtils.isBlank(code)) {
|
if (StringUtils.isBlank(code)) {
|
||||||
throw new ServiceException("验证码失效");
|
throw new ServiceException("验证码失效");
|
||||||
@ -184,16 +199,21 @@ public class DeviceShareService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int deviceShare(AppDeviceShareBo bo) {
|
public int deviceShare(AppDeviceShareBo bo) {
|
||||||
boolean flag = validateSmsCode(AppLoginHelper.getTenantId(), bo.getPhonenumber(), bo.getSmsCode());
|
|
||||||
if (!flag) {
|
|
||||||
throw new ServiceException("验证码错误");
|
|
||||||
}
|
|
||||||
|
|
||||||
Device device = deviceMapper.selectById(bo.getDeviceId());
|
Device device = deviceMapper.selectById(bo.getDeviceId());
|
||||||
if (device == null) {
|
if (device == null) {
|
||||||
throw new ServiceException("设备不存在");
|
throw new ServiceException("设备不存在");
|
||||||
}
|
}
|
||||||
Long userId = AppLoginHelper.getUserId();
|
|
||||||
|
boolean flag = validateSmsCode( bo.getPhonenumber(), bo.getSmsCode());
|
||||||
|
if (!flag) {
|
||||||
|
throw new ServiceException("验证码错误");
|
||||||
|
}
|
||||||
|
|
||||||
|
LambdaQueryWrapper<AppDeviceBindRecord> qw = new LambdaQueryWrapper<>();
|
||||||
|
qw.eq(AppDeviceBindRecord::getDeviceId, bo.getDeviceId());
|
||||||
|
AppDeviceBindRecord bindRecord = appDeviceBindRecordMapper.selectOne(qw);
|
||||||
|
Long userId = bindRecord.getBindingUserId();
|
||||||
|
|
||||||
LambdaQueryWrapper<AppDeviceShare> lqw = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<AppDeviceShare> lqw = new LambdaQueryWrapper<>();
|
||||||
lqw.eq(AppDeviceShare::getDeviceId, bo.getDeviceId());
|
lqw.eq(AppDeviceShare::getDeviceId, bo.getDeviceId());
|
||||||
lqw.eq(AppDeviceShare::getPhonenumber, bo.getPhonenumber());
|
lqw.eq(AppDeviceShare::getPhonenumber, bo.getPhonenumber());
|
||||||
|
@ -50,18 +50,32 @@
|
|||||||
|
|
||||||
<!-- 查询设备分享列表(web) -->
|
<!-- 查询设备分享列表(web) -->
|
||||||
<select id="selectWebDeviceShareList" resultType="com.fuyuanshen.app.domain.vo.AppDeviceShareVo">
|
<select id="selectWebDeviceShareList" resultType="com.fuyuanshen.app.domain.vo.AppDeviceShareVo">
|
||||||
select *
|
select d.device_name,
|
||||||
|
d.device_mac,
|
||||||
|
d.device_sn,
|
||||||
|
d.device_imei,
|
||||||
|
d.device_pic,
|
||||||
|
dt.type_name,
|
||||||
|
dt.communication_mode,
|
||||||
|
d.bluetooth_name,
|
||||||
|
dt.app_model_dictionary detailPageUrl,
|
||||||
|
c.binding_time,
|
||||||
|
ad.*,u.user_name otherPhonenumber
|
||||||
from
|
from
|
||||||
app_device_share ad
|
app_device_share ad
|
||||||
|
left join device d on ad.device_id = d.id
|
||||||
|
left join app_user u on ad.create_by = u.user_id
|
||||||
|
inner join device_type dt on d.device_type = dt.id
|
||||||
|
inner join app_device_bind_record c on d.id = c.device_id
|
||||||
<where>
|
<where>
|
||||||
<if test="bo.deviceId != null">
|
<if test="bo.deviceId != null">
|
||||||
and ad.device_id = #{bo.deviceId}
|
and ad.device_id = #{bo.deviceId}
|
||||||
</if>
|
</if>
|
||||||
<if test="bo.shareUser != null">
|
<if test="bo.shareUser != null">
|
||||||
and ad.share_user = #{bo.shareUser}
|
and u.user_name = #{bo.shareUser}
|
||||||
</if>
|
</if>
|
||||||
<if test="criteria.shareStartTime != null and criteria.hareEndTime != null">
|
<if test="bo.shareStartTime != null and bo.hareEndTime != null">
|
||||||
and d.create_time between #{bo.shareStartTime} and #{bo.shareEndTime}
|
and ad.create_time between #{bo.shareStartTime} and #{bo.shareEndTime}
|
||||||
</if>
|
</if>
|
||||||
</where>
|
</where>
|
||||||
|
|
||||||
|
@ -21,6 +21,18 @@ public class AlarmInformationVo {
|
|||||||
*/
|
*/
|
||||||
private Integer processingAlarm = 0;
|
private Integer processingAlarm = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 今日报警总数
|
||||||
|
*/
|
||||||
|
private Integer alarmsTotalToday = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 今日总处理报警
|
||||||
|
*/
|
||||||
|
private Integer processingAlarmToday = 0;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 强制报警
|
* 强制报警
|
||||||
*/
|
*/
|
||||||
|
@ -26,4 +26,24 @@ public class EquipmentClassificationVo {
|
|||||||
*/
|
*/
|
||||||
private Integer devices4GAndBluetooth = 0;
|
private Integer devices4GAndBluetooth = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备总数
|
||||||
|
*/
|
||||||
|
private Integer total;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算设备总数
|
||||||
|
*
|
||||||
|
* @return 设备总数
|
||||||
|
*/
|
||||||
|
public Integer getTotal() {
|
||||||
|
if (total == null) {
|
||||||
|
total = (equipment4G == null ? 0 : equipment4G) +
|
||||||
|
(deviceBluetooth == null ? 0 : deviceBluetooth) +
|
||||||
|
(devices4GAndBluetooth == null ? 0 : devices4GAndBluetooth);
|
||||||
|
}
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -99,11 +99,11 @@ public interface DeviceMapper extends BaseMapper<Device> {
|
|||||||
/**
|
/**
|
||||||
* 获取设备使用数据
|
* 获取设备使用数据
|
||||||
*
|
*
|
||||||
* @param deviceId 设备ID
|
* @param deviceTypeId 设备ID
|
||||||
* @param range 时间范围 1:半年 2:一年
|
* @param range 时间范围 1:半年 2:一年
|
||||||
* @return 每月使用数据列表
|
* @return 每月使用数据列表
|
||||||
*/
|
*/
|
||||||
List<Map<String, Object>> getEquipmentUsageData(Long deviceId, Integer range);
|
List<Map<String, Object>> getEquipmentUsageData(@Param("deviceTypeId") Long deviceTypeId, @Param("range") Integer range);
|
||||||
|
|
||||||
// 在DeviceMapper.java中添加方法
|
// 在DeviceMapper.java中添加方法
|
||||||
int getUsageDataForMonth(@Param("deviceId") Long deviceId,
|
int getUsageDataForMonth(@Param("deviceId") Long deviceId,
|
||||||
|
@ -139,9 +139,9 @@ public interface DeviceService extends IService<Device> {
|
|||||||
/**
|
/**
|
||||||
* 获取设备使用数据
|
* 获取设备使用数据
|
||||||
*
|
*
|
||||||
* @param deviceId
|
* @param deviceTypeId
|
||||||
* @param range
|
* @param range
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<Map<String, Object>> getEquipmentUsageData(Long deviceId, Integer range);
|
List<Map<String, Object>> getEquipmentUsageData(Long deviceTypeId, Integer range);
|
||||||
}
|
}
|
||||||
|
@ -630,6 +630,7 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
@Override
|
@Override
|
||||||
public EquipmentClassificationVo getEquipmentClassification() {
|
public EquipmentClassificationVo getEquipmentClassification() {
|
||||||
EquipmentClassificationVo equipmentClassification = deviceMapper.getEquipmentClassification();
|
EquipmentClassificationVo equipmentClassification = deviceMapper.getEquipmentClassification();
|
||||||
|
equipmentClassification.getTotal();
|
||||||
return equipmentClassification;
|
return equipmentClassification;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -648,13 +649,13 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
/**
|
/**
|
||||||
* 获取设备使用数据
|
* 获取设备使用数据
|
||||||
*
|
*
|
||||||
* @param deviceId 设备ID
|
* @param deviceTypeId 设备ID
|
||||||
* @param range 时间范围 1:半年 2:一年
|
* @param range 时间范围 1:半年 2:一年
|
||||||
* @return 每月使用数据列表
|
* @return 每月使用数据列表
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<Map<String, Object>> getEquipmentUsageData(Long deviceId, Integer range) {
|
public List<Map<String, Object>> getEquipmentUsageData(Long deviceTypeId, Integer range) {
|
||||||
List<Map<String, Object>> equipmentUsageData = deviceMapper.getEquipmentUsageData(deviceId, range);
|
List<Map<String, Object>> equipmentUsageData = deviceMapper.getEquipmentUsageData(deviceTypeId, range);
|
||||||
return equipmentUsageData;
|
return equipmentUsageData;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -321,11 +321,11 @@
|
|||||||
<!-- 获取数据总览 -->
|
<!-- 获取数据总览 -->
|
||||||
<select id="getDataOverview" resultType="com.fuyuanshen.equipment.domain.vo.DataOverviewVo">
|
<select id="getDataOverview" resultType="com.fuyuanshen.equipment.domain.vo.DataOverviewVo">
|
||||||
SELECT (SELECT COUNT(1) FROM device) AS devicesNumber,
|
SELECT (SELECT COUNT(1) FROM device) AS devicesNumber,
|
||||||
(SELECT COUNT(1) FROM device WHERE device_status = 1) AS equipmentOnline,
|
(SELECT COUNT(1) FROM device WHERE online_status = 1) AS equipmentOnline,
|
||||||
(SELECT COUNT(1) FROM device WHERE DATE (create_time) = CURDATE()) AS bindingNew, (
|
(SELECT COUNT(1) FROM device WHERE DATE (create_time) = CURDATE() AND binding_status = 1 ) AS bindingNew, (
|
||||||
SELECT COUNT (1)
|
SELECT COUNT (1)
|
||||||
FROM device
|
FROM device
|
||||||
WHERE device_status = 2) AS equipmentAbnormal
|
WHERE online_status = 2) AS equipmentAbnormal
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 获取设备分类 -->
|
<!-- 获取设备分类 -->
|
||||||
@ -347,55 +347,67 @@
|
|||||||
|
|
||||||
<!-- 获取告警信息 -->
|
<!-- 获取告警信息 -->
|
||||||
<select id="getAlarmInformation" resultType="com.fuyuanshen.equipment.domain.vo.AlarmInformationVo">
|
<select id="getAlarmInformation" resultType="com.fuyuanshen.equipment.domain.vo.AlarmInformationVo">
|
||||||
SELECT (SELECT COUNT(1) FROM device_alarm WHERE treatment_state = 0 AND DATE (create_time) = CURDATE()) AS alarmsTotal, (
|
SELECT (SELECT COUNT(1) FROM device_alarm WHERE treatment_state = 0) AS alarmsTotal
|
||||||
|
, (SELECT COUNT(1)
|
||||||
|
FROM device_alarm
|
||||||
|
WHERE treatment_state = 0) AS processingAlarm
|
||||||
|
, (SELECT COUNT(1)
|
||||||
|
FROM device_alarm
|
||||||
|
WHERE treatment_state = 0 AND
|
||||||
|
DATE (create_time) = CURDATE()) AS alarmsTotalToday
|
||||||
|
, (
|
||||||
SELECT COUNT (1)
|
SELECT COUNT (1)
|
||||||
FROM device_alarm
|
FROM device_alarm
|
||||||
WHERE treatment_state = 0
|
WHERE treatment_state = 0
|
||||||
AND DATE (create_time) = CURDATE()) AS processingAlarm
|
AND DATE (create_time) = CURDATE()) AS processingAlarmToday
|
||||||
, (
|
, (
|
||||||
SELECT COUNT (1)
|
SELECT COUNT (1)
|
||||||
FROM device_alarm
|
FROM device_alarm
|
||||||
WHERE device_action = 0
|
WHERE device_action = 0
|
||||||
AND DATE (create_time) = CURDATE()) AS alarmForced
|
) AS alarmForced
|
||||||
, (
|
, (
|
||||||
SELECT COUNT (1)
|
SELECT COUNT (1)
|
||||||
FROM device_alarm
|
FROM device_alarm
|
||||||
WHERE device_action = 1
|
WHERE device_action = 1
|
||||||
AND DATE (create_time) = CURDATE()) AS intrusionImpact
|
) AS intrusionImpact
|
||||||
, (
|
, (
|
||||||
SELECT COUNT (1)
|
SELECT COUNT (1)
|
||||||
FROM device_alarm
|
FROM device_alarm
|
||||||
WHERE device_action = 2
|
WHERE device_action = 2
|
||||||
AND DATE (create_time) = CURDATE()) AS alarmManual
|
) AS alarmManual
|
||||||
, (
|
, (
|
||||||
SELECT COUNT (1)
|
SELECT COUNT (1)
|
||||||
FROM device_alarm
|
FROM device_alarm
|
||||||
WHERE device_action = 3 AND DATE (create_time) = CURDATE()) AS fenceElectronic
|
WHERE device_action = 3) AS fenceElectronic
|
||||||
|
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 获取设备使用数据 -->
|
<!-- 获取设备使用数据 -->
|
||||||
<select id="getEquipmentUsageData" resultType="map">
|
<select id="getEquipmentUsageData" resultType="map">
|
||||||
SELECT COUNT(CASE WHEN MONTH (dl.create_time) = 1 THEN 1 END) AS m1,
|
SELECT COUNT(CASE WHEN MONTH (dl.create_time) = 1 THEN 1 END) AS m1,
|
||||||
COUNT(CASE WHEN MONTH (dl.create_time) = 2 THEN 1 END) AS m2,
|
COUNT(CASE WHEN MONTH (dl.create_time) = 2 THEN 1 END) AS m2,
|
||||||
COUNT(CASE WHEN MONTH (dl.create_time) = 3 THEN 1 END) AS m3,
|
COUNT(CASE WHEN MONTH (dl.create_time) = 3 THEN 1 END) AS m3,
|
||||||
COUNT(CASE WHEN MONTH (dl.create_time) = 4 THEN 1 END) AS m4,
|
COUNT(CASE WHEN MONTH (dl.create_time) = 4 THEN 1 END) AS m4,
|
||||||
COUNT(CASE WHEN MONTH (dl.create_time) = 5 THEN 1 END) AS m5,
|
COUNT(CASE WHEN MONTH (dl.create_time) = 5 THEN 1 END) AS m5,
|
||||||
COUNT(CASE WHEN MONTH (dl.create_time) = 6 THEN 1 END) AS m6,
|
COUNT(CASE WHEN MONTH (dl.create_time) = 6 THEN 1 END) AS m6,
|
||||||
COUNT(CASE WHEN MONTH (dl.create_time) = 7 THEN 1 END) AS m7,
|
COUNT(CASE WHEN MONTH (dl.create_time) = 7 THEN 1 END) AS m7,
|
||||||
COUNT(CASE WHEN MONTH (dl.create_time) = 8 THEN 1 END) AS m8,
|
COUNT(CASE WHEN MONTH (dl.create_time) = 8 THEN 1 END) AS m8,
|
||||||
COUNT(CASE WHEN MONTH (dl.create_time) = 9 THEN 1 END) AS m9,
|
COUNT(CASE WHEN MONTH (dl.create_time) = 9 THEN 1 END) AS m9,
|
||||||
COUNT(CASE WHEN MONTH (dl.create_time) = 10 THEN 1 END) AS m10,
|
COUNT(CASE WHEN MONTH (dl.create_time) = 10 THEN 1 END) AS m10,
|
||||||
COUNT(CASE WHEN MONTH (dl.create_time) = 11 THEN 1 END) AS m11,
|
COUNT(CASE WHEN MONTH (dl.create_time) = 11 THEN 1 END) AS m11,
|
||||||
COUNT(CASE WHEN MONTH (dl.create_time) = 12 THEN 1 END) AS m12
|
COUNT(CASE WHEN MONTH (dl.create_time) = 12 THEN 1 END) AS m12
|
||||||
FROM device_log dl
|
FROM device_log dl
|
||||||
LEFT JOIN device d ON dl.device_id = d.id
|
LEFT JOIN device d ON dl.device_id = d.id
|
||||||
LEFT JOIN device_type dt ON d.device_type = dt.id
|
LEFT JOIN device_type dt ON d.device_type = dt.id
|
||||||
WHERE dt.id = #{deviceId}
|
<where>
|
||||||
AND (
|
<if test="deviceTypeId != null">
|
||||||
|
dt.id = #{deviceTypeId}
|
||||||
|
</if>
|
||||||
|
AND (
|
||||||
(#{range} = 1 AND dl.create_time >= DATE_SUB(NOW(), INTERVAL 6 MONTH)) OR
|
(#{range} = 1 AND dl.create_time >= DATE_SUB(NOW(), INTERVAL 6 MONTH)) OR
|
||||||
(#{range} = 2 AND dl.create_time >= DATE_SUB(NOW(), INTERVAL 12 MONTH))
|
(#{range} = 2 AND dl.create_time >= DATE_SUB(NOW(), INTERVAL 12 MONTH))
|
||||||
)
|
)
|
||||||
|
</where>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="getUsageDataForMonth" resultType="java.lang.Integer">
|
<select id="getUsageDataForMonth" resultType="java.lang.Integer">
|
||||||
|
@ -56,7 +56,7 @@ public class ${ClassName}Controller extends BaseController {
|
|||||||
#end
|
#end
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出${functionName}列表
|
* ${functionName}列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("${permissionPrefix}:export")
|
@SaCheckPermission("${permissionPrefix}:export")
|
||||||
@Log(title = "${functionName}", businessType = BusinessType.EXPORT)
|
@Log(title = "${functionName}", businessType = BusinessType.EXPORT)
|
||||||
|
Reference in New Issue
Block a user