package com.ydtech.modules.admin.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ydtech.modules.admin.dao.SysDeptMapper; import com.ydtech.modules.admin.dao.SysGeographyPositionMapper; import com.ydtech.modules.admin.dao.SysGeographyPositionRecordMapper; import com.ydtech.modules.admin.model.SysDept; import com.ydtech.modules.admin.model.SysGeographyPosition; import com.ydtech.modules.admin.model.SysGeographyPositionRecord; import com.ydtech.modules.admin.model.SysUser; import com.ydtech.modules.admin.model.dto.*; import com.ydtech.modules.admin.model.vo.*; import com.ydtech.modules.admin.service.GeoService; import com.ydtech.modules.admin.service.SysGeographyPositionRecordService; import com.ydtech.modules.admin.service.SysGeographyPositionService; import com.ydtech.modules.admin.service.SysUserService; import com.ydtech.modules.order.entity.BasePageResult; import com.ydtech.utils.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @Service("SysGeographyPositionService") public class SysGeographyPositionServiceImpl extends ServiceImpl implements SysGeographyPositionService { @Resource private SysGeographyPositionMapper sysGeographyPositionMapper; @Resource private SysGeographyPositionRecordMapper sysGeographyPositionRecordMapper; @Resource private SysGeographyPositionRecordService sysGeographyPositionRecordService; @Resource private SysUserService sysUserService; @Resource private SysDeptMapper sysDeptMapper; @Resource private GeoService geoService; private static final String APP_GEO_KEY = "APPLocations"; @Override public SysGeographyPositionVo queryPosition(SysGeographyPositionDto sysGeographyPositionDto) { SysGeographyPositionVo sysGeographyPositionVo = new SysGeographyPositionVo(); List list = sysGeographyPositionMapper.selectList(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince()) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity()) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict()) .in(SysGeographyPosition::getSource, Arrays.asList("1", "2")) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getSource()), SysGeographyPosition::getSource, sysGeographyPositionDto.getSource()) .eq(sysGeographyPositionDto.getStatus() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus()) .orderByDesc(SysGeographyPosition::getCreateTime)); if (list.size() == 0) return new SysGeographyPositionVo(); List sysGeographyPositionList = BeanUtil.copyToList(list, SysGeographyPositionInfoVo.class); //填充机构名 for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : sysGeographyPositionList) { SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getId()); if (sysUser == null) continue; SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper() .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0)); if (sysDept == null) continue; sysGeographyPositionInfoVo.setDeptName(sysDept.getName()); } sysGeographyPositionVo.setList(sysGeographyPositionList); Long aLong = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper().eq(SysGeographyPosition::getStatus, 1).in(SysGeographyPosition::getSource, Arrays.asList("1", "2"))); sysGeographyPositionVo.setManNum(aLong); return sysGeographyPositionVo; } @Override public BasePageResult queryPositionList(SysGeographyPositionPageDto sysGeographyPositionPageDto) { Page page = new Page<>(sysGeographyPositionPageDto.getPageNum(), sysGeographyPositionPageDto.getPageSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StringUtils.isNotEmpty(sysGeographyPositionPageDto.getId()), SysGeographyPositionRecord::getUserId, sysGeographyPositionPageDto.getId()); wrapper.orderByDesc(SysGeographyPositionRecord::getCreateTime); Page insOrdersPage = sysGeographyPositionRecordService.page(page, wrapper); return new BasePageResult<>(sysGeographyPositionPageDto.getPageNum(), page.getSize(), insOrdersPage.getTotal(), page.getPages(), insOrdersPage.getRecords()); } @Override public SysPcAddressNumVo queryPcNum(SysGeographyPositionDto sysGeographyPositionDto) { SysPcAddressNumVo sysPcAddressNumVo = new SysPcAddressNumVo(); Long all = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince()) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity()) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict()) .in(SysGeographyPosition::getSource, Arrays.asList("1", "2")) .eq(sysGeographyPositionDto.getStatus() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus())); Long channelNum = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince()) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity()) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict()) .eq(SysGeographyPosition::getSource, 1) .eq(sysGeographyPositionDto.getStatus() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus())); Long proxyNum = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince()) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity()) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict()) .eq(SysGeographyPosition::getSource, 2) .eq(sysGeographyPositionDto.getStatus() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus())); Long onlineNum = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince()) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity()) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict()) .in(SysGeographyPosition::getSource, Arrays.asList("1", "2")) .eq(sysGeographyPositionDto.getStatus() == null, SysGeographyPosition::getStatus, 1) .eq(sysGeographyPositionDto.getStatus() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus())); sysPcAddressNumVo.setAllNum(all); sysPcAddressNumVo.setProxyNum(proxyNum); sysPcAddressNumVo.setChannelNum(channelNum); sysPcAddressNumVo.setOnlineNum(onlineNum); return sysPcAddressNumVo; } @Override public List queryRegionInfo(SysGeographyPositionDto sysGeographyPositionDto) { List regionInfoVos = new ArrayList<>(); //全部:null 渠道:1 代理:2 List sysGeographyPositionList = sysGeographyPositionMapper.selectList(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince()) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity()) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict()) .in(SysGeographyPosition::getSource, Arrays.asList("1", "2")) .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getSource()), SysGeographyPosition::getSource, sysGeographyPositionDto.getSource()) .eq(sysGeographyPositionDto.getStatus() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus())); if (CollectionUtil.isEmpty(sysGeographyPositionList)) return regionInfoVos; Map> map; if (StringUtils.isEmpty(sysGeographyPositionDto.getProvince())) { map = sysGeographyPositionList.stream().collect(Collectors.groupingBy(SysGeographyPosition::getProvince)); } else { if (StringUtils.isNotEmpty(sysGeographyPositionDto.getCity())) { map = sysGeographyPositionList.stream().collect(Collectors.groupingBy(SysGeographyPosition::getDistrict)); } else { map = sysGeographyPositionList.stream().collect(Collectors.groupingBy(SysGeographyPosition::getCity)); } } for (Map.Entry> entry : map.entrySet()) { RegionInfoVo regionInfoVo = new RegionInfoVo(); regionInfoVo.setDistrictName(entry.getKey()); regionInfoVo.setNumber(entry.getValue().size()); regionInfoVos.add(regionInfoVo); } return regionInfoVos; } @Override public List findLocationsWithinRadius(AdressRangeDto adressRangeDto) { geoService.addLocationGeography(list(), APP_GEO_KEY); List nearbyIds = geoService.findNearbyIds(APP_GEO_KEY, adressRangeDto.getLongitude(), adressRangeDto.getLatitude(), adressRangeDto.getRadius()); if (nearbyIds.size() == 0) return new ArrayList<>(); geoService.move(nearbyIds, APP_GEO_KEY); List sysGeographyPositions = listByIds(nearbyIds); List sysGeographyPositionInfoVoList = BeanUtil.copyToList(sysGeographyPositions, SysGeographyPositionInfoVo.class); if (sysGeographyPositionInfoVoList.size() == 0) return sysGeographyPositionInfoVoList; for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : sysGeographyPositionInfoVoList) { SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getId()); if (sysUser == null) continue; SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper() .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0)); if (sysDept == null) continue; sysGeographyPositionInfoVo.setDeptName(sysDept.getName()); } return sysGeographyPositionInfoVoList; } @Override public BasePageResult queryPcAddressInfo(PcAddressInfoDto addressInfoDto) { Page page = new Page<>(addressInfoDto.getPageNum(), addressInfoDto.getPageSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLng()), SysGeographyPosition::getLongitude, addressInfoDto.getLng()); wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLat()), SysGeographyPosition::getLatitude, addressInfoDto.getLat()); wrapper.in(SysGeographyPosition::getSource, Arrays.asList("1", "2")); wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getSource()), SysGeographyPosition::getSource, addressInfoDto.getSource()); wrapper.orderByDesc(SysGeographyPosition::getCreateTime); Page insOrdersPage = page(page, wrapper); List records = insOrdersPage.getRecords(); List sysGeographyPositionList = BeanUtil.copyToList(records, SysGeographyPositionInfoVo.class); //填充机构名 for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : sysGeographyPositionList) { SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getId()); if (sysUser == null) continue; SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper() .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0)); if (sysDept == null) continue; sysGeographyPositionInfoVo.setDeptName(sysDept.getName()); } return new BasePageResult<>(addressInfoDto.getPageNum(), page.getSize(), insOrdersPage.getTotal(), page.getPages(), sysGeographyPositionList); } @Override public PcAddressHistoryInfoVo getGeographyPosition(String dates) { PcAddressHistoryInfoVo pcAddressHistoryInfoVo = new PcAddressHistoryInfoVo(); QueryWrapper queryWrapper = new QueryWrapper<>(); // 指定 COUNT(DISTINCT user_id) 查询 queryWrapper.select("COUNT(DISTINCT user_id) AS total").likeRight(StringUtils.isNotEmpty(dates), "create_time", dates) .in("source", Arrays.asList(1, 2)); Map result = sysGeographyPositionRecordService.getMap(queryWrapper); Long total = (Long) result.get("total"); pcAddressHistoryInfoVo.setOnlineNum(total); if (StringUtils.isNullOrEmpty(dates)) { Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); dates = simpleDateFormat.format(date); } List geographyPosition = sysGeographyPositionRecordMapper.getGeographyPosition(dates); pcAddressHistoryInfoVo.setList(geographyPosition); return pcAddressHistoryInfoVo; } @Override public List getOnlinePeople() { return sysGeographyPositionMapper.selectList(new LambdaQueryWrapper().eq(SysGeographyPosition::getStatus,1)); } }