package com.moral.service.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javax.annotation.Resource; import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import com.github.pagehelper.PageHelper; import com.moral.common.bean.Constants; import com.moral.common.bean.PageBean; import com.moral.common.util.ExampleUtil; import com.moral.common.util.RedisUtils; import com.moral.common.util.StringUtils; import com.moral.common.util.ValidateUtil; import com.moral.entity.Device; import com.moral.entity.MonitorPoint; import com.moral.mapper.DeviceMapper; import com.moral.mapper.MonitorPointMapper; import com.moral.service.MonitorPointService; import tk.mybatis.mapper.entity.Example; import tk.mybatis.mapper.entity.Example.Criteria; @Service public class MonitorPointServiceImpl implements MonitorPointService { @Resource private MonitorPointMapper monitorPointMapper; @Resource private DeviceMapper deviceMapper; @Resource RedisUtils redisUtils; private static Class ENTITY_CLASS = MonitorPoint.class; @Override public List getMonitorPointsByAreaName(Map parameters) { ValidateUtil.notNull(parameters.get("areaName"), "param.is.null"); return monitorPointMapper.getMonitorPointsByAreaName(parameters); } @Override public List queryWithStateByMap(Map params){ params.put("isDelete",Constants.IS_DELETE_FALSE); List monitorPointList = monitorPointMapper.selectByMap(params); for(MonitorPoint monitorPoint:monitorPointList){ Integer state = getStateFromRedis(monitorPoint.getId()); monitorPoint.setState(state); } return monitorPointList; } private Integer getStateFromRedis(Integer monitorPointId){ StringBuilder key = new StringBuilder(); key.append("state_").append(monitorPointId).append("_*"); List stateList = redisUtils.getList(key.toString(),Map.class); int state = -1; if(stateList!=null){ for (Map deviceState:stateList){ int s = Integer.parseInt(deviceState.get("state").toString()); state = s>state&&s<4?s:state; } } state = state==-1?4:state; return state; } @Override public PageBean queryByPageBean(PageBean pageBean) { Example example = ExampleUtil.generateExample(ENTITY_CLASS,pageBean); List criteriaList = example.getOredCriteria(); if(criteriaList!=null&&criteriaList.size()>0){ for(Example.Criteria cri : criteriaList){ cri.andNotEqualTo("isDelete", Constants.IS_DELETE_TRUE); } }else { example.or().andNotEqualTo("isDelete",Constants.IS_DELETE_TRUE); } PageHelper.startPage(pageBean.getPageIndex(),pageBean.getPageSize()); List monitorPointList = monitorPointMapper.selectWithAreaNameByExample(example); return new PageBean(monitorPointList); } @Override public MonitorPoint queryWithRelationById(Integer id){ Example example = new Example(ENTITY_CLASS); example.or().andEqualTo("id",id); List monitorPointList = monitorPointMapper.selectWithAreaNameByExample(example); return monitorPointList!=null&&monitorPointList.size()>0?monitorPointList.get(0):null; } @Override public void addOrModify(MonitorPoint monitorPoint) { try{ if(monitorPoint.getId()==null){ monitorPoint.setIsDelete(Constants.IS_DELETE_FALSE); monitorPointMapper.insertSelective(monitorPoint); }else{ MonitorPoint queryMonitorPoint = new MonitorPoint(); queryMonitorPoint.setId(monitorPoint.getId()); queryMonitorPoint.setOrganizationId(monitorPoint.getOrganizationId()); // num = 1,说明未改变,此查询在更新之前 Integer num = monitorPointMapper.selectCount(queryMonitorPoint); boolean needRefreshCach = (num!=1); monitorPointMapper.updateByPrimaryKeySelective(monitorPoint); if(needRefreshCach){ // 刷新当前监控点下设备 在redis里设备信息 refreshDevicesInRedis(monitorPoint.getId()); } } } catch (Exception ex){ throw ex; } } /* 刷新当前监控点下设备 在redis里设备信息 */ private void refreshDevicesInRedis(int monitorPointId){ Device queryDevice = new Device(); queryDevice.setMonitorPointId(monitorPointId); List deviceList = deviceMapper.select(queryDevice); if (!CollectionUtils.isEmpty(deviceList)){ List orgIds = monitorPointMapper.selectOrganizationIds(monitorPointId); if (!CollectionUtils.isEmpty(orgIds)){ deviceList.stream().forEach(dev ->{ if(!StringUtils.isNullOrEmpty(dev.getMac())){ String key = "device_"+dev.getMac(); // // 简化的设备信息 用以缓存redis // Device simpleDevice = new Device(); // simpleDevice.setId(dev.getId()); // simpleDevice.setDeviceVersion(dev.getDeviceVersion()); // simpleDevice.setMac(dev.getMac()); // simpleDevice.setMonitorPointId(dev.getMonitorPointId()); // 设置新组织关系,防止读写分离时数据库同步延迟 dev.setOrganizationIds(orgIds); redisUtils.set(key,dev); } }); } } } @Override public void deleteByIds(Integer... ids) { MonitorPoint monitorPoint = new MonitorPoint(); monitorPoint.setIsDelete(Constants.IS_DELETE_TRUE); if(ids!=null&&ids.length>0){ if(ids.length==1){ monitorPoint.setId(ids[0]); monitorPointMapper.updateByPrimaryKeySelective(monitorPoint); }else{ Example example = new Example(ENTITY_CLASS); example.or().andIn("id", Arrays.asList(ids)); monitorPointMapper.updateByExampleSelective(monitorPoint,example); } } } @Override public List getMonitorPointsByName(String name) { Example example = new Example(MonitorPoint.class); Criteria criteria = example.createCriteria(); criteria.andEqualTo("isDelete", Constants.IS_DELETE_FALSE).andLike("name", "%" + name + "%"); example.or().andEqualTo("isDelete", Constants.IS_DELETE_FALSE) .andCondition("getPY(" + getReplaceStr("name") + ") like ", "%" + name + "%"); List monitorPoints = monitorPointMapper.selectByExample(example); return monitorPoints; } private String getReplaceStr(String name){ List list = new ArrayList(); list.add(new String[]{"(",""}); list.add(new String[]{")",""}); for (String[] string : list) { name = replace(name,string[0],string[1]); } return name; } private String replace(String name,String fromStr,String toStr){ return "REPLACE (" + name + ",'" + fromStr + "','" + toStr + "')"; } /** * * @param idList * @return {id:,state:} */ @Override public List> queryMonitroPointsState(List idList) { List> list = idList.stream().map( id -> { Integer state = getStateFromRedis(id); Map stateMap = new HashMap<>(); stateMap.put("id",id.toString()); stateMap.put("state",state.toString()); return stateMap; }).collect(Collectors.toList()); return list; } @Override public List getMonitorPointsByOrganizationId(Integer orgId) { Example example = new Example(MonitorPoint.class); Criteria criteria = example.createCriteria(); criteria.andEqualTo("isDelete", Constants.IS_DELETE_FALSE); if (Constants.isNotSpecialOrgId(orgId)) { criteria.andEqualTo("organizationId", orgId); } example.orderBy("name").asc(); return monitorPointMapper.selectByExample(example); } @Override public List getMonitorPointsByRegion(Map parameters) { Example example = new Example(MonitorPoint.class); Criteria criteria = example.createCriteria(); criteria.andEqualTo("isDelete", Constants.IS_DELETE_FALSE); criteria.andEqualTo(parameters.get("name").toString(), parameters.get("value")); return monitorPointMapper.selectByExample(example); } @Override public List queryVersionsById(Integer id){ return monitorPointMapper.selectVersionsById(id); } @Override public MonitorPoint queryMonitorPointById(Integer mpointId) { return this.monitorPointMapper.selectByPrimaryKey(mpointId); } }