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