diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java index 613bb7ea..388c84f7 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.RandomUtil; 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.service.AppDeviceShareService; import com.fuyuanshen.app.service.IAppDeviceShareService; import com.fuyuanshen.common.core.constant.Constants; import com.fuyuanshen.common.core.domain.R; @@ -45,7 +46,7 @@ public class AppDeviceShareController extends BaseController { private final IAppDeviceShareService deviceShareService; - private final DeviceShareService appDeviceShareService; + private final AppDeviceShareService appDeviceShareService; /** * 分享管理列表 diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceHBYController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceHBYController.java new file mode 100644 index 00000000..01883072 --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceHBYController.java @@ -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 getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(appDeviceService.getInfo(id)); + } + + /** + * 人员信息登记 + */ + @PostMapping(value = "/registerPersonInfo") +// @FunctionAccessAnnotation("registerPersonInfo") + public R registerPersonInfo(@Validated(AddGroup.class) @RequestBody AppPersonnelInfoBo bo) { + return toAjax(appDeviceService.registerPersonInfo(bo)); + } + + /** + * 发送信息 + */ + @PostMapping(value = "/sendMessage") + @FunctionAccessBatcAnnotation(value = "sendMessage", timeOut = 30, batchMaxTimeOut = 40) + public R sendMessage(@RequestBody AppDeviceSendMsgBo bo) { + return toAjax(appDeviceService.sendMessage(bo)); + } + + /** + * 发送报警信息 + */ + @PostMapping(value = "/sendAlarmMessage") + @FunctionAccessBatcAnnotation(value = "sendAlarmMessage", timeOut = 5, batchMaxTimeOut = 10) + public R sendAlarmMessage(@RequestBody AppDeviceSendMsgBo bo) { + return toAjax(appDeviceService.sendAlarmMessage(bo)); + } + + /** + * 上传设备logo图片 + */ + @PostMapping("/uploadLogo") + @FunctionAccessAnnotation("uploadLogo") + public R 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 lightModeSettings(@RequestBody DeviceInstructDto params) { + // params 转 JSONObject + appDeviceService.lightModeSettings(params); + return R.ok(); + } + + /** + * 灯光亮度设置 + * + */ +// @FunctionAccessAnnotation("lightBrightnessSettings") + @PostMapping("/lightBrightnessSettings") + public R lightBrightnessSettings(@RequestBody DeviceInstructDto params) { + appDeviceService.lightBrightnessSettings(params); + return R.ok(); + } + + /** + * 激光模式设置 + * + */ + @PostMapping("/laserModeSettings") +// @FunctionAccessAnnotation("laserModeSettings") + public R laserModeSettings(@RequestBody DeviceInstructDto params) { + appDeviceService.laserModeSettings(params); + return R.ok(); + } + +} diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceXinghanController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceXinghanController.java index 85fb39a0..d60d321e 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceXinghanController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceXinghanController.java @@ -83,7 +83,7 @@ public class AppDeviceXinghanController extends BaseController { } /** - * SOS档位 + * SOS档位s * SOS档位,2,1,0, 分别表示红蓝模式/爆闪模式/关闭 */ @PostMapping("/SOSGradeSettings") diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java new file mode 100644 index 00000000..44d1ba42 --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java @@ -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 queryPageList(AppDeviceShareBo bo, PageQuery pageQuery) { + Long userId = AppLoginHelper.getUserId(); + bo.setCreateBy(userId); + Page page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + Page result = appDeviceShareMapper.selectAppDeviceShareList(bo, page); + List records = result.getRecords(); + records.forEach(AppDeviceShareService::buildDeviceStatus); + return TableDataInfo.build(result); + } + + public TableDataInfo queryWebPageList(AppDeviceShareBo bo, PageQuery pageQuery) { +// Long userId = AppLoginHelper.getUserId(); +// bo.setCreateBy(userId); + Page page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + Page result = appDeviceShareMapper.selectWebDeviceShareList(bo, page); + List 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 queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AppDeviceShare::getId, id); + List 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 qw = new LambdaQueryWrapper<>(); + qw.eq(AppPersonnelInfo::getDeviceId, device.getId()); + List 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 lqw = new LambdaQueryWrapper<>(); + lqw.eq(AppDeviceShare::getDeviceId, bo.getDeviceId()); + lqw.eq(AppDeviceShare::getPhonenumber, bo.getPhonenumber()); + Long count = appDeviceShareMapper.selectCount(lqw); + if (count > 0) { + + UpdateWrapper 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 otherDeviceShareList(AppDeviceShareBo bo, PageQuery pageQuery) { + String username = AppLoginHelper.getUsername(); + bo.setPhonenumber(username); + Page page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + IPage result = appDeviceShareMapper.otherDeviceShareList(bo, page); + List records = result.getRecords(); + + records.forEach(AppDeviceShareService::buildDeviceStatus); + return TableDataInfo.build(result); + } + + + /** + * 查询设备分享列表(web) + * + * @param bo + * @param pageQuery + * @return + */ + public TableDataInfo queryWebList(AppDeviceShareBo bo, PageQuery pageQuery) { + Page page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + Page result = appDeviceShareMapper.selectWebDeviceShareList(bo, page); + List records = result.getRecords(); + records.forEach(AppDeviceShareService::buildDeviceStatus); + return TableDataInfo.build(result); + } + +} diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/listener/RedisKeyExpirationListener.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/listener/RedisKeyExpirationListener.java index 86e669a0..b3f64ecd 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/listener/RedisKeyExpirationListener.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/listener/RedisKeyExpirationListener.java @@ -1,23 +1,44 @@ 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.fuyuanshen.common.core.constant.GlobalConstants; import com.fuyuanshen.common.redis.utils.RedisUtils; +import com.fuyuanshen.equipment.domain.Device; +import com.fuyuanshen.equipment.mapper.DeviceMapper; import com.fuyuanshen.global.mqtt.listener.domain.FunctionAccessStatus; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import java.time.Duration; -import java.util.HashMap; -import java.util.Map; import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_TIMEOUT_KEY; +import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX; +import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX; @Component @Slf4j public class RedisKeyExpirationListener implements MessageListener { + @Autowired + @Qualifier("threadPoolTaskExecutor") + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + + @Autowired + private DeviceMapper deviceMapper; + + @Autowired + private LockTemplate lockTemplate; + @Override public void onMessage(Message message, byte[] pattern) { String expiredKey = new String(message.getBody()); @@ -26,8 +47,44 @@ public class RedisKeyExpirationListener implements MessageListener { String element = expiredKey.substring(FUNCTION_ACCESS_KEY.length()); handleFunctionAccessExpired(element); } - } + 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 deviceUpdateWrapper = new UpdateWrapper<>(); +// deviceUpdateWrapper.eq("device_imei", element); +// deviceUpdateWrapper.set("online_status", 0); +// deviceMapper.update(deviceUpdateWrapper); +// }); + 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()); + + // 构造设备锁键 + String deviceLockKey = GlobalConstants.GLOBAL_REDIS_KEY + ":device_lock:" + element; + + // 尝试获取Redis锁 + LockInfo lockInfo = lockTemplate.lock(deviceLockKey, 30000L, 5000L, RedissonLockExecutor.class); // 30秒过期 + + if (lockInfo != null) { + try { + UpdateWrapper 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过期事件 * @param element 批次ID diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqLocationDataRule.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqLocationDataRule.java index 0c3bda1f..69637bfd 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqLocationDataRule.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqLocationDataRule.java @@ -117,28 +117,28 @@ public class BjqLocationDataRule implements MqttMessageRule { if(StringUtils.isBlank(latitude) || StringUtils.isBlank(longitude)){ return; } - String[] latArr = latitude.split("\\."); - String[] lonArr = longitude.split("\\."); - // 将位置信息存储到Redis中 +// String[] latArr = latitude.split("\\."); +// String[] lonArr = longitude.split("\\."); +// // 将位置信息存储到Redis中 String redisKey = GlobalConstants.GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX+ deviceImei + DEVICE_LOCATION_KEY_PREFIX; - String redisObj = RedisUtils.getCacheObject(redisKey); - JSONObject jsonOBj = JSONObject.parseObject(redisObj); - if(jsonOBj != null){ - String str1 = latArr[0] +"."+ latArr[1].substring(0,4); - String str2 = lonArr[0] +"."+ lonArr[1].substring(0,4); - - String cacheLatitude = jsonOBj.getString("wgs84_latitude"); - String cacheLongitude = jsonOBj.getString("wgs84_longitude"); - String[] latArr1 = cacheLatitude.split("\\."); - String[] lonArr1 = cacheLongitude.split("\\."); - - String cacheStr1 = latArr1[0] +"."+ latArr1[1].substring(0,4); - String cacheStr2 = lonArr1[0] +"."+ lonArr1[1].substring(0,4); - if(str1.equals(cacheStr1) && str2.equals(cacheStr2)){ - log.info("位置信息未发生变化: device={}, lat={}, lon={}", deviceImei, latitude, longitude); - return; - } - } +// String redisObj = RedisUtils.getCacheObject(redisKey); +// JSONObject jsonOBj = JSONObject.parseObject(redisObj); +// if(jsonOBj != null){ +// String str1 = latArr[0] +"."+ latArr[1].substring(0,4); +// String str2 = lonArr[0] +"."+ lonArr[1].substring(0,4); +// +// String cacheLatitude = jsonOBj.getString("wgs84_latitude"); +// String cacheLongitude = jsonOBj.getString("wgs84_longitude"); +// String[] latArr1 = cacheLatitude.split("\\."); +// String[] lonArr1 = cacheLongitude.split("\\."); +// +// String cacheStr1 = latArr1[0] +"."+ latArr1[1].substring(0,4); +// String cacheStr2 = lonArr1[0] +"."+ lonArr1[1].substring(0,4); +// if(str1.equals(cacheStr1) && str2.equals(cacheStr2)){ +// log.info("位置信息未发生变化: device={}, lat={}, lon={}", deviceImei, latitude, longitude); +// return; +// } +// } // 构造位置信息对象 Map locationInfo = new LinkedHashMap<>(); diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/queue/MqttMessageQueueConstants.java b/fys-admin/src/main/java/com/fuyuanshen/global/queue/MqttMessageQueueConstants.java index b4eb34d2..392e06bc 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/queue/MqttMessageQueueConstants.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/queue/MqttMessageQueueConstants.java @@ -1,6 +1,8 @@ package com.fuyuanshen.global.queue; +import com.fuyuanshen.common.core.constant.GlobalConstants; + public class MqttMessageQueueConstants { - public static final String MQTT_MESSAGE_QUEUE_KEY = "mqtt:message:queue"; - public static final String MQTT_MESSAGE_DEDUP_KEY = "mqtt:message:dedup"; + public static final String MQTT_MESSAGE_QUEUE_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "mqtt:message:queue"; + public static final String MQTT_MESSAGE_DEDUP_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "mqtt:message:dedup"; } diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceChargeDischargeController.java b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceChargeDischargeController.java index c8cc77c4..c43890fd 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceChargeDischargeController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceChargeDischargeController.java @@ -39,7 +39,7 @@ public class DeviceChargeDischargeController extends BaseController { /** * 查询设备充放电记录列表 */ - @SaCheckPermission("equipment:chargeDischarge:list") + // @SaCheckPermission("equipment:chargeDischarge:list") @GetMapping("/list") public TableDataInfo list(DeviceChargeDischargeBo bo, PageQuery pageQuery) { return deviceChargeDischargeService.queryPageList(bo, pageQuery); @@ -48,7 +48,7 @@ public class DeviceChargeDischargeController extends BaseController { /** * 设备充放电记录列表 */ - @SaCheckPermission("equipment:chargeDischarge:export") + // @SaCheckPermission("equipment:chargeDischarge:export") @Log(title = "设备充放电记录", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(DeviceChargeDischargeBo bo, HttpServletResponse response) { @@ -61,7 +61,7 @@ public class DeviceChargeDischargeController extends BaseController { * * @param id 主键 */ - @SaCheckPermission("equipment:chargeDischarge:query") + // @SaCheckPermission("equipment:chargeDischarge:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { @@ -71,7 +71,7 @@ public class DeviceChargeDischargeController extends BaseController { /** * 新增设备充放电记录 */ - @SaCheckPermission("equipment:chargeDischarge:add") + // @SaCheckPermission("equipment:chargeDischarge:add") @Log(title = "设备充放电记录", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() @@ -82,7 +82,7 @@ public class DeviceChargeDischargeController extends BaseController { /** * 修改设备充放电记录 */ - @SaCheckPermission("equipment:chargeDischarge:edit") + // @SaCheckPermission("equipment:chargeDischarge:edit") @Log(title = "设备充放电记录", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() @@ -95,11 +95,13 @@ public class DeviceChargeDischargeController extends BaseController { * * @param ids 主键串 */ - @SaCheckPermission("equipment:chargeDischarge:remove") + // @SaCheckPermission("equipment:chargeDischarge:remove") @Log(title = "设备充放电记录", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { return toAjax(deviceChargeDischargeService.deleteWithValidByIds(List.of(ids), true)); } + + } diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceShareController.java b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceShareController.java index e623e9d6..ce2cc2be 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceShareController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceShareController.java @@ -1,18 +1,32 @@ 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.vo.AppDeviceShareVo; +import com.fuyuanshen.common.core.constant.Constants; +import com.fuyuanshen.common.core.domain.R; +import com.fuyuanshen.common.core.validate.AddGroup; +import com.fuyuanshen.common.idempotent.annotation.RepeatSubmit; import com.fuyuanshen.common.mybatis.core.page.PageQuery; 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.equipment.domain.bo.DeviceAlarmBo; -import com.fuyuanshen.equipment.domain.vo.DeviceAlarmVo; import com.fuyuanshen.web.service.DeviceShareService; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; 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.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +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; /** * 设备分享管理 @@ -26,18 +40,66 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("api/equipment/share") public class DeviceShareController extends BaseController { - private final DeviceShareService appDeviceShareService; + private final DeviceShareService deviceShareService; /** - *查询设备分享列表(web) + * 分享管理列表 */ - // @SaCheckPermission("equipment:alarm:list") - @GetMapping("/list") + @GetMapping("/deviceShareList") public TableDataInfo list(AppDeviceShareBo bo, PageQuery pageQuery) { - return appDeviceShareService.queryWebList(bo, pageQuery); + return deviceShareService.queryWebPageList(bo, pageQuery); } + /** + * 新增设备分享 + */ + @RepeatSubmit() + @PostMapping("/deviceShare") + public R deviceShare(@Validated(AddGroup.class) @RequestBody AppDeviceShareBo bo) { + return toAjax(deviceShareService.deviceShare(bo)); + } + /** + * 权限管理 + */ + @RepeatSubmit() + @PostMapping("/permission") + public R permission(@Validated(AddGroup.class) @RequestBody AppDeviceShareBo bo) { + return toAjax(deviceShareService.deviceShare(bo)); + } + + /** + * 移除分享用户 + * + * @param ids 主键串 + */ + @DeleteMapping("/{ids}") + public R 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 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 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(); + } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/HomePageController.java b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/HomePageController.java index b8786bf7..8052c39f 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/HomePageController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/HomePageController.java @@ -1,17 +1,16 @@ package com.fuyuanshen.web.controller.device; import com.fuyuanshen.common.core.domain.R; +import com.fuyuanshen.equipment.domain.vo.AlarmInformationVo; import com.fuyuanshen.equipment.domain.vo.DataOverviewVo; +import com.fuyuanshen.equipment.domain.vo.EquipmentClassificationVo; import com.fuyuanshen.equipment.service.DeviceService; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /** * 首页数据 @@ -39,29 +38,38 @@ public class HomePageController { } - - - // 获取设备使用数据 - @GetMapping("/{deviceId}") - public Map getUsageData( - @PathVariable String deviceId, - @RequestParam String range) { - - Map response = new HashMap<>(); - - if ("halfYear".equals(range)) { - response.put("months", Arrays.asList("1月", "2月", "3月", "4月", "5月", "6月")); - response.put("data", Arrays.asList(45, 52, 38, 60, 56, 48)); - } else if ("oneYear".equals(range)) { - response.put("months", Arrays.asList("7月", "8月", "9月", "10月", "11月", "12月", - "1月", "2月", "3月", "4月", "5月", "6月")); - response.put("data", Arrays.asList(42, 38, 45, 48, 52, 55, 45, 52, 38, 60, 56, 48)); - } - - response.put("deviceId", deviceId); - response.put("range", range); - response.put("lastUpdate", new Date()); - - return response; + /** + * 获取 设备分类 + * DataOverview + */ + @GetMapping("/getEquipmentClassification") + public R getEquipmentClassification() { + return R.ok(deviceService.getEquipmentClassification()); } + + + /** + * 获取 报警信息 + * DataOverview + */ + @GetMapping("/getAlarmInformation") + public R getAlarmInformation() { + return R.ok(deviceService.getAlarmInformation()); + } + + + /** + * 获取设备使用数据 + * + * @param deviceTypeId 设备ID (可选) + * @param range 时间范围 1:半年 2:一年 + * @return 每月使用数据列表 + */ + @GetMapping("/getEquipmentUsageData/{range}") + public R>> getEquipmentUsageData(@PathVariable Integer range, + @RequestParam(required = false) Long deviceTypeId) { + return R.ok(deviceService.getEquipmentUsageData(deviceTypeId, range)); + } + + } diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/WEBDeviceController.java b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/WEBDeviceController.java index c9580591..aa1fc9f4 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/WEBDeviceController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/WEBDeviceController.java @@ -3,6 +3,8 @@ package com.fuyuanshen.web.controller.device; import com.fuyuanshen.app.domain.AppPersonnelInfoRecords; import com.fuyuanshen.common.core.domain.R; +import com.fuyuanshen.common.mybatis.core.page.PageQuery; +import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.web.core.BaseController; import com.fuyuanshen.equipment.domain.DeviceLog; import com.fuyuanshen.equipment.domain.vo.DeviceAlarmVo; @@ -65,7 +67,7 @@ public class WEBDeviceController extends BaseController { * @param deviceId * @return */ - @Operation(summary = "设备详情") + @Operation(summary = "设备用户详情") @GetMapping(value = "/getDeviceUser/{deviceId}") public R> getDeviceUser(@PathVariable Long deviceId) { List device = deviceService.getDeviceUser(deviceId); @@ -77,13 +79,18 @@ public class WEBDeviceController extends BaseController { * 设备操作记录 * * @param deviceId + * @param startTime 开始时间 + * @param endTime 结束时间 * @return */ @Operation(summary = "设备操作记录") @GetMapping(value = "/getOperationRecord/{deviceId}") - public R> getOperationRecord(@PathVariable Long deviceId) { - List device = deviceService.getOperationRecord(deviceId); - return R.ok(device); + public TableDataInfo getOperationRecord(@PathVariable Long deviceId, + @RequestParam(required = false) String startTime, + @RequestParam(required = false) String endTime, + PageQuery pageQuery) { + TableDataInfo device = deviceService.getOperationRecord(deviceId, startTime, endTime,pageQuery); + return device; } @@ -91,13 +98,17 @@ public class WEBDeviceController extends BaseController { * 设备告警记录 * * @param deviceId + * @param startTime 开始时间 + * @param endTime 结束时间 * @return */ @Operation(summary = "设备告警记录") @GetMapping(value = "/getAlarmRecord/{deviceId}") - public R> getAlarmRecord(@PathVariable Long deviceId) { - List device = deviceService.getAlarmRecord(deviceId); - return R.ok(device); + public TableDataInfo getAlarmRecord(@PathVariable Long deviceId, + @RequestParam(required = false) String startTime, + @RequestParam(required = false) String endTime, + PageQuery pageQuery) { + return deviceService.getAlarmRecord(deviceId, startTime, endTime, pageQuery); } diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/DeviceShareService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/DeviceShareService.java index 9e493b14..42204bb7 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/DeviceShareService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/DeviceShareService.java @@ -2,15 +2,18 @@ package com.fuyuanshen.web.service; import com.alibaba.fastjson2.JSONObject; 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.metadata.IPage; 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.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.AppDeviceBindRecordMapper; import com.fuyuanshen.app.mapper.AppDeviceShareMapper; import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper; import com.fuyuanshen.common.core.constant.GlobalConstants; @@ -50,6 +53,8 @@ public class DeviceShareService { private final AppPersonnelInfoMapper appPersonnelInfoMapper; + private final AppDeviceBindRecordMapper appDeviceBindRecordMapper; + public TableDataInfo queryPageList(AppDeviceShareBo bo, PageQuery pageQuery) { Long userId = AppLoginHelper.getUserId(); bo.setCreateBy(userId); @@ -60,6 +65,16 @@ public class DeviceShareService { return TableDataInfo.build(result); } + public TableDataInfo queryWebPageList(AppDeviceShareBo bo, PageQuery pageQuery) { +// Long userId = AppLoginHelper.getUserId(); +// bo.setCreateBy(userId); + Page page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + Page result = appDeviceShareMapper.selectWebDeviceShareList(bo, page); + List records = result.getRecords(); + records.forEach(DeviceShareService::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); @@ -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); if (StringUtils.isBlank(code)) { throw new ServiceException("验证码失效"); @@ -184,16 +199,21 @@ public class DeviceShareService { } 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(); + + boolean flag = validateSmsCode( bo.getPhonenumber(), bo.getSmsCode()); + if (!flag) { + throw new ServiceException("验证码错误"); + } + + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(AppDeviceBindRecord::getDeviceId, bo.getDeviceId()); + AppDeviceBindRecord bindRecord = appDeviceBindRecordMapper.selectOne(qw); + Long userId = bindRecord.getBindingUserId(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(AppDeviceShare::getDeviceId, bo.getDeviceId()); lqw.eq(AppDeviceShare::getPhonenumber, bo.getPhonenumber()); diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/WEBDeviceService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/WEBDeviceService.java index 7066a519..121982ff 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/WEBDeviceService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/WEBDeviceService.java @@ -53,16 +53,21 @@ public interface WEBDeviceService extends IService { * 设备操作记录 * * @param deviceId + * @param startTime 开始时间 + * @param endTime 结束时间 * @return */ - List getOperationRecord(Long deviceId); + TableDataInfo getOperationRecord(Long deviceId, String startTime, String endTime, PageQuery pageQuery); /** * 设备告警记录 * * @param deviceId + * @param startTime 开始时间 + * @param endTime 结束时间 * @return */ - List getAlarmRecord(Long deviceId); + TableDataInfo getAlarmRecord(Long deviceId, String startTime, String endTime, PageQuery pageQuery); + } diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java index 17c8d8ae..c62d89c3 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java @@ -100,7 +100,6 @@ public class DeviceBJQBizService { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", deviceId) - .eq("binding_user_id", AppLoginHelper.getUserId()) .set("send_msg", bo.getSendMsg()); deviceMapper.update(updateWrapper); @@ -538,6 +537,6 @@ public class DeviceBJQBizService { private boolean getDeviceStatus(String deviceImei) { String deviceOnlineStatusRedisKey = GlobalConstants.GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX+ deviceImei + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX ; - return StringUtils.isBlank(deviceOnlineStatusRedisKey); + return RedisUtils.getCacheObject(deviceOnlineStatusRedisKey) == null; } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceXinghanBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceXinghanBizService.java index 29b8374b..52a6b41b 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceXinghanBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceXinghanBizService.java @@ -330,10 +330,10 @@ public class DeviceXinghanBizService { AppLoginHelper.getUserId()); } - private boolean isDeviceOffline(String imei) { - // 原方法名语义相反,这里取反,使含义更清晰 - return getDeviceStatus(imei); - } +// private boolean isDeviceOffline(String imei) { +// // 原方法名语义相反,这里取反,使含义更清晰 +// return getDeviceStatus(imei); +// } /** * 记录设备操作日志 @@ -359,9 +359,9 @@ public class DeviceXinghanBizService { } } - private boolean getDeviceStatus(String deviceImei) { + private boolean isDeviceOffline(String deviceImei) { String deviceOnlineStatusRedisKey = GlobalConstants.GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX+ deviceImei + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX ; - return StringUtils.isBlank(deviceOnlineStatusRedisKey); + return RedisUtils.getCacheObject(deviceOnlineStatusRedisKey)==null; } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/impl/WEBDeviceServiceImpl.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/impl/WEBDeviceServiceImpl.java index cc927804..6e7d5a16 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/impl/WEBDeviceServiceImpl.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/impl/WEBDeviceServiceImpl.java @@ -1,16 +1,20 @@ package com.fuyuanshen.web.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fuyuanshen.app.domain.AppDeviceBindRecord; import com.fuyuanshen.app.domain.AppDeviceShare; import com.fuyuanshen.app.domain.AppPersonnelInfoRecords; -import com.fuyuanshen.app.domain.vo.AppDeviceShareVo; import com.fuyuanshen.app.mapper.AppDeviceBindRecordMapper; import com.fuyuanshen.app.mapper.AppDeviceShareMapper; import com.fuyuanshen.app.mapper.AppPersonnelInfoRecordsMapper; +import com.fuyuanshen.common.mybatis.core.page.PageQuery; +import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.equipment.domain.Device; import com.fuyuanshen.equipment.domain.DeviceAlarm; import com.fuyuanshen.equipment.domain.DeviceAssignments; @@ -23,7 +27,6 @@ import com.fuyuanshen.equipment.mapper.DeviceAssignmentsMapper; import com.fuyuanshen.equipment.mapper.DeviceLogMapper; import com.fuyuanshen.equipment.mapper.DeviceMapper; import com.fuyuanshen.web.service.WEBDeviceService; -import com.fuyuanshen.web.service.device.DeviceBizService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -129,11 +132,19 @@ public class WEBDeviceServiceImpl extends ServiceImpl impl * @return */ @Override - public List getOperationRecord(Long deviceId) { - List logList = deviceLogMapper.selectList( - new QueryWrapper().eq("device_id", deviceId) - .orderByDesc("create_time")); - return logList; + public TableDataInfo getOperationRecord(Long deviceId, String startTime, String endTime, PageQuery pageQuery) { + Page page = pageQuery.build(); + QueryWrapper queryWrapper = new QueryWrapper().eq("device_id", deviceId); + + if (StrUtil.isNotEmpty(startTime)) { + queryWrapper.ge("create_time", startTime); + } + if (StrUtil.isNotEmpty(endTime)) { + queryWrapper.le("create_time", endTime); + } + queryWrapper.orderByDesc("create_time"); + IPage logList = deviceLogMapper.selectPage(page, queryWrapper); + return TableDataInfo.build(logList); } @@ -144,13 +155,23 @@ public class WEBDeviceServiceImpl extends ServiceImpl impl * @return */ @Override - public List getAlarmRecord(Long deviceId) { - List alarmList = deviceAlarmMapper.selectList( - new QueryWrapper().eq("device_id", deviceId) - .orderByDesc("create_time")); - List deviceAlarmVoList = BeanUtil.copyToList(alarmList, DeviceAlarmVo.class); - return deviceAlarmVoList; + public TableDataInfo getAlarmRecord(Long deviceId, String startTime, String endTime, PageQuery pageQuery) { + Page page = pageQuery.build(); + QueryWrapper queryWrapper = new QueryWrapper().eq("device_id", deviceId); + + if (StrUtil.isNotEmpty(startTime)) { + queryWrapper.ge("start_time", startTime); + } + if (StrUtil.isNotEmpty(endTime)) { + queryWrapper.le("start_time", endTime); + } + queryWrapper.orderByDesc("start_time"); + IPage alarmPage = deviceAlarmMapper.selectPage(page, queryWrapper); + + // List deviceAlarmVoList = BeanUtil.copyToList(alarmPage.getRecords(), DeviceAlarmVo.class); + return TableDataInfo.build(alarmPage); } - } + + diff --git a/fys-common/fys-common-encrypt/src/main/java/com/fuyuanshen/common/encrypt/utils/EncryptUtilsTest.java b/fys-common/fys-common-encrypt/src/main/java/com/fuyuanshen/common/encrypt/utils/EncryptUtilsTest.java index 08b352ac..05e035d2 100644 --- a/fys-common/fys-common-encrypt/src/main/java/com/fuyuanshen/common/encrypt/utils/EncryptUtilsTest.java +++ b/fys-common/fys-common-encrypt/src/main/java/com/fuyuanshen/common/encrypt/utils/EncryptUtilsTest.java @@ -39,8 +39,8 @@ public class EncryptUtilsTest { loginBody.setClientId("e5cd7e4891bf95d1d19206ce24a7b32e"); loginBody.setGrantType("password"); loginBody.setTenantId("894078"); - loginBody.setCode("9"); - loginBody.setUuid("d5be31eac1244cee851a9903f358bc6a"); + loginBody.setCode("0"); + loginBody.setUuid("1d6615668c7f410da77c4e002c601073"); // loginBody.setUsername("admin"); // loginBody.setPassword("admin123"); loginBody.setUsername("dyf"); diff --git a/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml b/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml index 0b76a8e3..8b77aecb 100644 --- a/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml +++ b/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml @@ -50,18 +50,32 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fys-modules/fys-generator/src/main/resources/vm/java/controller.java.vm b/fys-modules/fys-generator/src/main/resources/vm/java/controller.java.vm index 9f9c8185..6b836491 100644 --- a/fys-modules/fys-generator/src/main/resources/vm/java/controller.java.vm +++ b/fys-modules/fys-generator/src/main/resources/vm/java/controller.java.vm @@ -56,7 +56,7 @@ public class ${ClassName}Controller extends BaseController { #end /** - * 导出${functionName}列表 + * ${functionName}列表 */ @SaCheckPermission("${permissionPrefix}:export") @Log(title = "${functionName}", businessType = BusinessType.EXPORT)