package com.moral.service.impl; import java.util.*; import java.util.stream.Collectors; import javax.annotation.Resource; import com.alibaba.fastjson.TypeReference; import com.github.pagehelper.Page; import com.moral.common.bean.Constants; import com.moral.common.bean.PageBean; import com.moral.common.bean.PageResult; import com.moral.common.util.ExampleUtil; import com.moral.common.util.RedisUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; import com.github.pagehelper.PageHelper; import com.moral.common.util.ValidateUtil; import com.moral.entity.Device; import com.moral.mapper.DeviceMapper; import com.moral.service.AccountService; import com.moral.service.DeviceService; import tk.mybatis.mapper.entity.Example; @Service public class DeviceServiceImpl implements DeviceService { @Resource private DeviceMapper deviceMapper; @Resource private AccountService accountService; private Class ENTITY_CLASS = Device.class; @Resource RedisUtils redisUtils; @Override public Map getDeviceStatesByAccount(Map parameters) { ValidateUtil.notNull(parameters.get("accountId"), "param.is.null"); Map result = new HashMap(); accountService.setOrgIdsByAccount(parameters); List> list = deviceMapper.getDeviceStatesByAccount(parameters); Long all = 0L, normal = 0L, abnormal = 0L, stop = 0L; for (Map map : list) { Long count = (Long) map.get("count"); all += count; switch (Integer.valueOf((String) map.get("state"))) { case 0: normal = count; break; case 4: stop = count; break; default: abnormal += count; } } result.put("all", all); result.put("normal", normal); result.put("abnormal", abnormal); result.put("stop", stop); return result; } @Override @Transactional public void saveOrUpdateDevice(Device device) { ValidateUtil.notNull(device, "param.is.null"); ValidateUtil.notEmpty(device.getMac(), "param.is.null"); Device queryDevice = new Device(); queryDevice.setMac(device.getMac()); queryDevice = deviceMapper.selectOne(queryDevice); Date operateDate = new Date(); device.setInstallTime(operateDate); if (ObjectUtils.isEmpty(queryDevice)) { device.setCreateTime(operateDate); device.setState("4"); device.setIsDelete(Constants.IS_DELETE_FALSE); deviceMapper.insertSelective(device); }else { device.setId(queryDevice.getId()); deviceMapper.updateByPrimaryKeySelective(device); } } @Override public List getInstallDevicesByOperateUser(Integer uid, Integer pageIndex, Integer pageSize) { ValidateUtil.notNull(uid, "param.is.null"); Device device = new Device(); device.setOperateUserId(uid); PageHelper.startPage(pageIndex, pageSize); List devices = deviceMapper.select(device); return devices; } @Override public Device getDeviceByMac(String mac) { ValidateUtil.notEmpty(mac, "param.is.null"); Device device = new Device(); device.setMac(mac); device = deviceMapper.selectOne(device); return device; } /** * * @param map * map里 包括 组织id和4个坐标点 * @return */ @Override public List query(Map map) { List list = deviceMapper.selectByMap(map); loadDeviceState(list); return list; } /** * 根据组织id和设备名称 分页查询设备 * @param orgId * @param deviceName * @param pageSize * @param pageNo * @return */ @Override public PageResult query(Integer orgId, String deviceName, Integer pageSize, Integer pageNo) { if(!ObjectUtils.isEmpty(pageSize)&&!ObjectUtils.isEmpty(pageNo)){ PageHelper.startPage(pageNo,pageSize); } List list = deviceMapper.selectByOrgIdAndDevName(orgId,deviceName); //从redis里取状态 loadDeviceState(list); if(list instanceof Page){ return new PageResult(((Page) list).getTotal(),list); } return new PageResult(null,list); } /** * 根据组织id和监控点id 分页查询设备 * @param orgId * @param mpId * @param pageSize * @param pageNo * @return */ @Override public PageResult query(Integer orgId, Integer mpId, Integer pageSize, Integer pageNo) { if(!ObjectUtils.isEmpty(pageSize)&&!ObjectUtils.isEmpty(pageNo)){ PageHelper.startPage(pageNo,pageSize); } List list = deviceMapper.selectByOrgIdAndMpId(orgId,mpId); //从redis里取状态 loadDeviceState(list); if(list instanceof Page){ return new PageResult(((Page) list).getTotal(),list); } return new PageResult(null,list); } private void loadDeviceState(List list){ //从redis里取状态 list.stream().map( device -> { String mac = Optional.of(device.getMac()).get(); String state = getSateFromRedis(device.getMonitorPointId(),mac.toLowerCase()); device.setState(state); return device; }).count(); } private String getSateFromRedis(Integer mpId,String mac){ Map stateMap = getStateMapFromRedis(mpId,mac); String state = null; if(stateMap != null){ state = stateMap.get("state"); } state = state == null ?Constants.DEVICE_STATE_OFFLINE:state; return state; } public Map getStateMapFromRedis(Integer mpId,String mac){ StringBuilder key = new StringBuilder(); //拼凑key key.append("state_").append(mpId).append("_").append(mac); return redisUtils.get(key.toString(),new TypeReference>(){}); } private Device getDeviceWithOrgIdsByMac(String mac) { String key = "device_"+mac; Device device = redisUtils.get(key,Device.class); if(device==null) { device = deviceMapper.selectWithOrgIdsByMac(mac); if(device!=null){ redisUtils.set(key,device); } } return device; } @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); } if(pageBean.getPageSize()>0){ PageHelper.startPage(pageBean.getPageIndex(),pageBean.getPageSize()); } List organizationList = deviceMapper.selectWithRelationData(example); return new PageBean(organizationList); } @Override public void deleteByIds(Integer[] ids) { Device device = new Device(); device.setIsDelete(Constants.IS_DELETE_TRUE); if(ids!=null&&ids.length>0){ if(ids.length==1){ device.setId(ids[0]); deviceMapper.updateByPrimaryKeySelective(device); }else{ Example example = new Example(ENTITY_CLASS); example.or().andIn("id", Arrays.asList(ids)); deviceMapper.updateByExampleSelective(device,example); } } } @Override public void addOrModify(Device device){ try{ //mac 转小写 if(StringUtils.isBlank(device.getMac())){ device.setMac(device.getMac().toLowerCase()); } if(device.getId()==null){ device.setIsDelete(Constants.IS_DELETE_FALSE); deviceMapper.insertSelective(device); }else{ deviceMapper.updateByPrimaryKeySelective(device); } } catch (Exception ex){ throw ex; } } @Override public List getDevicesByMonitorPointId(Integer monitorPointId) { Device device = new Device(); device.setMonitorPointId(monitorPointId); device.setIsDelete(Constants.IS_DELETE_FALSE); return deviceMapper.select(device); } /** * 返回map{mac:,state:} * @param macList * @return */ @Override public List> queryDevicesState(List macList,Boolean withData) { List> list = macList.stream().map(mac->{ mac = mac.toLowerCase(); Device device = getDeviceWithOrgIdsByMac(mac); Map resultMap = new HashMap<>(); Map stateMap = getStateMapFromRedis(device.getMonitorPointId(),mac); if(!MapUtils.isEmpty(stateMap)){ resultMap.putAll(stateMap); }else{ resultMap.put("state",Constants.DEVICE_STATE_OFFLINE); resultMap.put("mac",mac); } if(BooleanUtils.isTrue(withData)){ String dataKey = "data_"+mac; Map dataMap = redisUtils.get(dataKey,new TypeReference>(){}); if(!MapUtils.isEmpty(dataMap)){ resultMap.putAll(dataMap); } } return resultMap; }).collect(Collectors.toList()); return list; } }