package com.fuyuanshen.web.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 DeviceShareService { 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(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); 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(DeviceShareService::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(DeviceShareService::buildDeviceStatus); return TableDataInfo.build(result); } }