package com.bizmatics.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.bizmatics.common.core.exception.BusinessException;
import com.bizmatics.common.core.util.BeanMapperUtils;
import com.bizmatics.common.mvc.base.AbstractCrudService;
import com.bizmatics.model.*;
import com.bizmatics.model.system.SysUser;
import com.bizmatics.persistence.mapper.AlarmPowerMapper;
import com.bizmatics.persistence.mapper.DeviceMapper;
import com.bizmatics.persistence.mapper.SiteMapper;
import com.bizmatics.persistence.mapper.system.SysUserMapper;
import com.bizmatics.service.*;
import com.bizmatics.service.enums.DeviceStatusCode;
import com.bizmatics.service.util.SecurityUtils;
import com.bizmatics.service.vo.DeviceCountVO;
import com.bizmatics.service.vo.SiteVO;
import com.bizmatics.service.vo.SiteVOT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
*
* 服务实现类
*
*
* @author ya
* @since 2021-07-07
*/
@Slf4j
@Service
public class SiteServiceImpl extends AbstractCrudService implements SiteService {
@Autowired
private DeviceMapper deviceMapper;
@Autowired
private DeviceService deviceService;
@Autowired
private AlarmPowerMapper alarmPowerMapper;
@Autowired
private UserSiteService userSiteService;
@Autowired
private SiteDynamicPropertiesService siteDynamicPropertiesService;
@Autowired
private RouteService routeService;
@Autowired
private SysUserMapper userMapper;
@Override
public DeviceCountVO selectCount() {
Integer userId = SecurityUtils.getLoginUser().getUser().getUserId().intValue();
DeviceCountVO deviceCountVO = new DeviceCountVO();
deviceCountVO.setNormalCount(baseMapper.selectCount(userId, null, DeviceStatusCode.NORMAL.getValue()));
deviceCountVO.setOffLineCount(baseMapper.selectCount(userId, null, DeviceStatusCode.OFFLINE.getValue()));
deviceCountVO.setDeviceCount(baseMapper.selectCount(userId, null, DeviceStatusCode.DEVICE.getValue()));
deviceCountVO.setFaultCount(baseMapper.selectCount(userId, null, DeviceStatusCode.FAULT.getValue()));
deviceCountVO.setCount(userSiteService.count(userId));
return deviceCountVO;
}
@Override
public List list(String name) {
Integer userId = SecurityUtils.getLoginUser().getUser().getUserId().intValue();
List tenantDaya = userMapper.getTenantId(SecurityUtils.getLoginUser().getUser().getUserId());
if (tenantDaya.size() < 0) {
throw new BusinessException("无此租户,请联系管理员");
}
return baseMapper.list(userId, name, tenantDaya.get(0).getTenantId());
}
@Override
public List list2(String name) {
Integer userId = SecurityUtils.getLoginUser().getUser().getUserId().intValue();
return baseMapper.list2(userId, name);
}
@Override
public List siteList(String name) {
LambdaQueryWrapper QueryWrapper = Wrappers.lambdaQuery();
QueryWrapper.eq(Site::getEnable, 1);
if (null != name) {
QueryWrapper.eq(Site::getSiteName, name);
}
List siteList = this.list(QueryWrapper);
return siteList;
}
@Override
public List siteAndStatusList(String name) {
List list = new ArrayList<>();
Integer userId = SecurityUtils.getLoginUser().getUser().getUserId().intValue();
List tenantDaya = userMapper.getTenantId(SecurityUtils.getLoginUser().getUser().getUserId());
if (tenantDaya.size() < 0) {
throw new BusinessException("无此租户,请联系管理员");
}
List sites = baseMapper.list(userId, name, tenantDaya.get(0).getTenantId());
List deviceList = deviceMapper.list(userId, null, null, null, null, null);
List alarmPowers = alarmPowerMapper.list(userId, null, null, null, null, null, 1);
sites.forEach(site -> list.add(enhanceSite(deviceList, site, alarmPowers)));
return list;
}
@Override
public SiteVO getOne(Long siteId) {
Site site = baseMapper.selectOne(Wrappers.lambdaQuery(Site.class).eq(Site::getId, siteId));
return Optional.ofNullable(site)
.map(st -> {
// LambdaQueryWrapper deviceLambdaQueryWrapper = Wrappers.lambdaQuery();
// deviceLambdaQueryWrapper.eq(Device::getSiteId, site.getId());
// List list = deviceService.list(deviceLambdaQueryWrapper);
List list = baseMapper.getDeviceListOne(site.getId());
Integer count = alarmPowerMapper.selectCount(null, site.getId(), null, null, null, null, 1);
SiteVO siteVO = enhanceSite(list, site, null);
siteVO.setAlarmPowerCount(count);
return siteVO;
})
.orElseThrow(() -> new BusinessException("站点信息不存在"));
}
public SiteVO enhanceSite(List list, Site site, List alarmPowers) {
SiteVO siteVo = BeanMapperUtils.map(site, SiteVO.class);
siteVo.setDeviceCount(list.size());
long deviceCount = list.stream()
.filter(device -> device.getSiteId().equals(site.getId()))
.filter(device -> DeviceStatusCode.DEVICE.getValue().equals(device.getDeviceStatus()))
.count();
long faultCount = list.stream()
.filter(device -> device.getSiteId().equals(site.getId()))
.filter(device -> DeviceStatusCode.FAULT.getValue().equals(device.getDeviceStatus()))
.count();
long offCount = list.stream()
.filter(device -> device.getSiteId().equals(site.getId()))
.filter(device -> DeviceStatusCode.OFFLINE.getValue().equals(device.getDeviceStatus()))
.count();
if (CollectionUtils.isNotEmpty(alarmPowers)) {
siteVo.setAlarmPowerCount((int) alarmPowers.stream().filter(alarmPower -> alarmPower.getSiteId().equals(site.getId())).count());
} else {
siteVo.setAlarmPowerCount(0);
}
if (deviceCount > 0) {
siteVo.setStatus(DeviceStatusCode.FAULT.getDescribe());
} else if (offCount > 0) {
siteVo.setStatus(DeviceStatusCode.OFFLINE.getDescribe());
} else if (faultCount > 0) {
siteVo.setStatus(DeviceStatusCode.FAULT.getDescribe());
} else {
siteVo.setStatus(DeviceStatusCode.NORMAL.getDescribe());
}
List deviceTypes = list.stream()
.filter(device -> device.getSiteId().equals(site.getId()))
.map(Device::getDeviceType).collect(Collectors.toList());
siteVo.setDeviceType(deviceTypes);
return siteVo;
}
@Override
public void siteAdd(SiteVOT siteVOT) {
List tenantDaya = userMapper.getTenantId(SecurityUtils.getLoginUser().getUser().getUserId());
if (tenantDaya.size() < 0) {
throw new BusinessException("无此租户,请联系管理员");
}
SysUser user = SecurityUtils.getLoginUser().getUser();
Site site1 = siteVOT.getSite();
site1.setCreateTime(new Date());
site1.setCreator(user.getUserName());
site1.setCompanyCode(11111);
site1.setEnable(1);
site1.setTenantId(tenantDaya.get(0).getTenantId());
this.save(site1);
int ID = site1.getId();
SiteDynamicProperties siteDynamicProperties = siteVOT.getSiteDynamicProperties();
siteDynamicProperties.setSiteId(ID);
siteDynamicProperties.setCreator(user.getUserName());
siteDynamicProperties.setCreateTime(LocalDateTime.now());
siteDynamicPropertiesService.siteDynamicPropertiesAdd(siteDynamicProperties);
userSiteService.UserSiteAdd(ID);
}
@Override
public List getSite(String id) {
List TemplateDataList = null;
TemplateDataList = baseMapper.templateQuery(Integer.parseInt(id));
// TemplateData TemplateDataListOne = (TemplateData) TemplateDataList.get(0);
return TemplateDataList;
}
@Override
public void siteUpdate(SiteVOT siteVOT) {
this.updateById(siteVOT.getSite());
siteDynamicPropertiesService.updateById(siteVOT.getSiteDynamicProperties());
}
@Override
public void sitedel(String id) {
List SiteList = null;
SiteList = baseMapper.list1(Integer.parseInt(id));
Site SiteList1 = (Site) SiteList.get(0);
SiteList1.setId(Integer.parseInt(id));
SiteList1.setEnable(0);
this.updateById(SiteList1);
}
@Override
public List