package com.moral.api.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.moral.api.entity.*; import com.moral.api.mapper.*; import com.moral.api.pojo.vo.device.DeviceVO; import com.moral.api.service.DeviceService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.util.LogUtils; import com.moral.constant.Constants; import com.moral.constant.RedisConstants; import com.moral.util.ConvertUtils; import com.moral.util.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; import javax.servlet.http.HttpServletRequest; /** *

* 设备表 服务实现类 *

* * @author moral * @since 2021-05-11 */ @Service public class DeviceServiceImpl extends ServiceImpl implements DeviceService { @Autowired private DeviceMapper deviceMapper; @Autowired private ManageAccountMapper manageAccountMapper; @Autowired private OrganizationMapper organizationMapper; @Autowired private MonitorPointMapper monitorPointMapper; @Autowired private SysDictTypeMapper sysDictTypeMapper; @Autowired private SysDictDataMapper sysDictDataMapper; @Autowired private LogUtils logUtils; @Autowired private RedisTemplate redisTemplate; @Autowired private OrganizationUnitAlarmMapper organizationUnitAlarmMapper; @Autowired private VersionSensorUnitMapper versionSensorUnitMapper; /* * 从redis获取设备信息 * */ private Map getDeviceInfoFromRedis(String mac) { Map deviceInfo = (Map) redisTemplate.opsForValue().get(RedisConstants.DEVICE + mac); return deviceInfo; } /* * 设备信息存入redis */ private void setDeviceInfoToRedis(String mac, Map deviceInfo) { redisTemplate.opsForValue().set(getDeviceKey(mac), deviceInfo); } /* * 从redis删除设备信息 */ private void delDeviceInfoFromRedis(String mac) { redisTemplate.delete(getDeviceKey(mac)); } /* * 获取设备信息在redis里的key */ private String getDeviceKey(String mac) { return keysConnect(RedisConstants.DEVICE, mac); } //redis key前缀 private String keysConnect(String... keys) { StringBuilder key = new StringBuilder(keys[0]); for (int i = 1; i < keys.length; i++) { key.append("_"); key.append(keys[i]); } return key.toString().toLowerCase(); } @Override @Transactional public void insert(Device device) { Integer orgId = monitorPointMapper.selectById(device.getMonitorPointId()).getOrganizationId(); device.setOrganizationId(orgId); deviceMapper.insert(device); Map deviceInfo = selectDeviceInfoById(device.getId()); //维护组织型号关系表 QueryWrapper queryOrganizationVersionWrapper = new QueryWrapper<>(); queryOrganizationVersionWrapper.eq("organization_id",orgId); queryOrganizationVersionWrapper.eq("version_id",device.getDeviceVersionId()); queryOrganizationVersionWrapper.eq("is_delete",Constants.NOT_DELETE); List organizationUnitAlarms = organizationUnitAlarmMapper.selectList(queryOrganizationVersionWrapper); if(ObjectUtils.isEmpty(organizationUnitAlarms)){ QueryWrapper queryVersionSensorUnitWrapper =new QueryWrapper<>(); queryVersionSensorUnitWrapper.eq("version_id",device.getDeviceVersionId()); queryVersionSensorUnitWrapper.eq("is_delete",Constants.NOT_DELETE); List versionSensorUnits = versionSensorUnitMapper.selectList(queryVersionSensorUnitWrapper); if(!ObjectUtils.isEmpty(versionSensorUnits)){ for (VersionSensorUnit versionSensorUnit : versionSensorUnits) { OrganizationUnitAlarm organizationUnitAlarm = new OrganizationUnitAlarm(); organizationUnitAlarm.setOrganizationId(orgId); organizationUnitAlarm.setVersionId(device.getDeviceVersionId()); organizationUnitAlarm.setSensorCode(versionSensorUnit.getSensorCode()); organizationUnitAlarm.setUnitKey(versionSensorUnit.getUnitKey()); organizationUnitAlarmMapper.insert(organizationUnitAlarm); } } } //新增设备信息存入redis String mac = device.getMac(); //从redis中删除设备信息 delDeviceInfoFromRedis(mac); //设备信息存入redis setDeviceInfoToRedis(mac, deviceInfo); //操作日志记录 HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); StringBuilder content = new StringBuilder(); content.append("添加了设备:").append(device.getName()).append(";").append("mac:").append(mac); logUtils.saveOperationForManage(request, content.toString(), Constants.INSERT_OPERATE_TYPE); } @Override @Transactional public void delete(Integer deviceId) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", deviceId).set("is_delete", Constants.DELETE); deviceMapper.update(null, updateWrapper); Device device = deviceMapper.selectById(deviceId); String mac = device.getMac(); //从redis中删除设备信息 delDeviceInfoFromRedis(mac); //操作日志记录 HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); StringBuilder content = new StringBuilder(); content.append("删除了设备:").append(device.getName()).append(";").append("mac:").append(mac); logUtils.saveOperationForManage(request, content.toString(), Constants.DELETE_OPERATE_TYPE); } @Override @Transactional public void update(Device device) { Integer deviceId = device.getId(); Device oldDevice = deviceMapper.selectById(deviceId); deviceMapper.updateById(device); String mac = deviceMapper.selectById(deviceId).getMac(); //从redis中删除设备信息 delDeviceInfoFromRedis(mac); Map deviceInfo = selectDeviceInfoById(deviceId); //设备信息存入redis setDeviceInfoToRedis(mac, deviceInfo); //操作日志记录 HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); StringBuilder content = new StringBuilder(); content.append("修改了设备:").append(mac).append(":"); Field[] fields = Device.class.getDeclaredFields(); for (Field field : fields) { if (field.getName().equals("id")) { continue; } if ("serialVersionUID".equals(field.getName())) { continue; } String fieldName = field.getName(); PropertyDescriptor pd = null; try { pd = new PropertyDescriptor(fieldName, Device.class); Method method = pd.getReadMethod(); Object o1 = method.invoke(oldDevice); Object o2 = method.invoke(device); if (o2 != null) { content.append(fieldName).append(":").append(o1).append("-->").append(o2).append(";"); } } catch (Exception e) { e.printStackTrace(); } } logUtils.saveOperationForManage(request, content.toString(), Constants.UPDATE_OPERATE_TYPE); } @Override public List> selectAllOperators() { //维护人列表 QueryWrapper operatorWrapper = new QueryWrapper<>(); operatorWrapper.select("id", "user_name").eq("is_delete", Constants.NOT_DELETE); return manageAccountMapper.selectMaps(operatorWrapper); } //根据字典类型获取字典数据 @Override public List> selectDeviceDictData(String dictType) { QueryWrapper typeQueryWrapper = new QueryWrapper<>(); typeQueryWrapper.select("id").eq("name", dictType); SysDictType sysDictType = sysDictTypeMapper.selectOne(typeQueryWrapper); QueryWrapper dataQueryWrapper = new QueryWrapper<>(); dataQueryWrapper.select("dataKey", "dataValue").eq("dict_type_id", sysDictType.getId()).eq("is_delete", Constants.NOT_DELETE); return sysDictDataMapper.selectMaps(dataQueryWrapper); } @Override public List> selectMonitorsByOrgId(Integer orgId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select("id", "name").eq("organization_id", orgId).eq("is_delete", Constants.NOT_DELETE); return monitorPointMapper.selectMaps(queryWrapper); } @Override public Map selectDevicesByOrgId(Map parameters) { return selectDevices(parameters); } @Override public Map selectDevicesByMpId(Map parameters) { return selectDevices(parameters); } @Override public Map selectDevices(Map parameters) { QueryWrapper queryWrapper = new QueryWrapper<>(); int page = Integer.parseInt(parameters.get("page").toString()); int size = Integer.parseInt(parameters.get("size").toString()); Object order = parameters.get("order"); Object orderType = parameters.get("orderType"); Object name = parameters.get("name"); Object mac = parameters.get("mac"); Object orgId = parameters.get("organizationId"); Object mpId = parameters.get("monitorPointId"); //查询某组织下所有设备 if (orgId != null) { queryWrapper.eq("organization_id", orgId); } //查询某站点下所有设备 if (mpId != null) { queryWrapper.eq("monitor_point_id", mpId); } if (name != null) { queryWrapper.like("name", name); } if (mac != null) { queryWrapper.like("mac", mac); } //排序参数,默认create_time降序 if (order != null && orderType != null) { if (Constants.ORDER_ASC.equals(orderType)) { queryWrapper.orderByAsc(ConvertUtils.toLine(order.toString())); } else { queryWrapper.orderByDesc(ConvertUtils.toLine(order.toString())); } } else { queryWrapper.orderByDesc("create_time"); } queryWrapper.eq("is_delete", Constants.NOT_DELETE); Page devicePage = new Page<>(page, size); deviceMapper.selectPage(devicePage, queryWrapper); List devices = devicePage.getRecords(); List> items = new ArrayList<>(); for (Device device : devices) { Map deviceInfo = selectDeviceInfoById(device.getId()); items.add(deviceInfo); } Map result = new LinkedHashMap<>(); result.put("total", devicePage.getTotal()); result.put("totalPage", devicePage.getPages()); result.put("current", devicePage.getCurrent()); result.put("pageSize", devicePage.getSize()); result.put("item", items); return result; } @Override public Map selectDeviceInfoById(Integer deviceId) { String mac = deviceMapper.selectById(deviceId).getMac(); Map deviceInfo = getDeviceInfoFromRedis(mac); //先从redis中取 if (deviceInfo != null) { return deviceInfo; } deviceInfo = new LinkedHashMap<>(); DeviceVO device = deviceMapper.selectDeviceInfoById(deviceId); //设备 deviceInfo.put("id", device.getId()); deviceInfo.put("name", device.getName()); deviceInfo.put("mac", device.getMac()); deviceInfo.put("address", device.getAddress()); deviceInfo.put("longitude", device.getLongitude()); deviceInfo.put("latitude", device.getLatitude()); deviceInfo.put("createTime", DateUtils.dateToDateString(device.getCreateTime())); deviceInfo.put("installTime", device.getInstallTime() == null ? null : DateUtils.dateToDateString(device.getInstallTime())); //扩展字段 deviceInfo.put("extend", device.getExtend()); //行业 deviceInfo.put("profession", device.getProfession()); deviceInfo.put("professionName", device.getProfessionName()); //工艺 deviceInfo.put("tech", device.getTech()); deviceInfo.put("techName", device.getTechName()); //检测器 deviceInfo.put("detector", device.getDetector()); deviceInfo.put("detectorName", device.getDetectorName()); //采购商 deviceInfo.put("purchaser", device.getPurchaser()); deviceInfo.put("purchaserName", device.getPurchaserName()); //型号 Map versionInfo = new LinkedHashMap<>(); Version version = device.getVersion(); versionInfo.put("id", version.getId()); versionInfo.put("name", version.getName()); deviceInfo.put("version", versionInfo); //维护人 List> operatorsInfo = new ArrayList<>(); List operators = device.getOperators(); for (ManageAccount operator : operators) { Map operatorMap = new LinkedHashMap<>(); operatorMap.put("id", operator.getId()); operatorMap.put("name", operator.getUserName()); operatorsInfo.add(operatorMap); } deviceInfo.put("operators", operatorsInfo); //组织 Map orgInfo = new LinkedHashMap<>(); Organization organization = device.getOrganization(); orgInfo.put("id", organization.getId()); orgInfo.put("name", organization.getName()); deviceInfo.put("organization", orgInfo); //站点 Map mpInfo = new LinkedHashMap<>(); MonitorPoint monitorPoint = device.getMonitorPoint(); mpInfo.put("id", monitorPoint.getId()); mpInfo.put("name", monitorPoint.getName()); deviceInfo.put("monitorPoint", mpInfo); setDeviceInfoToRedis(mac, deviceInfo); return deviceInfo; } @Override public List> selectAllOrganization() { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select("id", "name").eq("is_delete", Constants.NOT_DELETE); return organizationMapper.selectMaps(queryWrapper); } @Override public List> selectAllMonitorPoint() { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select("id", "name").eq("is_delete", Constants.NOT_DELETE); return monitorPointMapper.selectMaps(queryWrapper); } @Override public Map getDeviceByMac(String mac) { Map deviceInfo = getDeviceInfoFromRedis(mac); if (deviceInfo == null) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("mac", mac).eq("is_delete", Constants.NOT_DELETE); Device device = deviceMapper.selectOne(queryWrapper); if (device != null) { deviceInfo = selectDeviceInfoById(device.getId()); setDeviceInfoToRedis(mac, deviceInfo); } } return deviceInfo; } @Override public Map adjustDeviceData(Map deviceData, Map deviceInfo) { return null; } @Override public Map judgeDeviceState(Map deviceData, Map deviceInfo) { return null; } }