package com.ydtech.modules.admin.service.impl; 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.SysPcAddressHistoryMapper; import com.ydtech.modules.admin.dao.SysPcAddressMapper; import com.ydtech.modules.admin.model.SysDept; import com.ydtech.modules.admin.model.SysUser; import com.ydtech.modules.admin.model.dto.*; import com.ydtech.modules.admin.model.po.SysPcAddressHistory; import com.ydtech.modules.admin.model.po.SysPcAddress; import com.ydtech.modules.admin.model.vo.PcAddressHistoryInfoVo; import com.ydtech.modules.admin.model.vo.PcAddressHistoryTimeVo; import com.ydtech.modules.admin.model.vo.RegionInfoVo; import com.ydtech.modules.admin.service.GeoService; import com.ydtech.modules.admin.service.SysPcAddressHistoryService; import com.ydtech.modules.admin.service.SysPcAddressService; import com.ydtech.modules.admin.service.SysUserService; import com.ydtech.modules.order.entity.BasePageResult; import com.ydtech.utils.StringUtils; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @author Administrator * @description 针对表【sys_pc_address(pc获取ip地址)】的数据库操作Service实现 * @createDate 2024-09-02 09:40:08 */ @Service @RequiredArgsConstructor public class SysPcAddressServiceImpl extends ServiceImpl implements SysPcAddressService { private final SysPcAddressHistoryService sysPcAddressHistoryService; private final SysPcAddressMapper sysPcAddressMapper; private final SysPcAddressHistoryMapper sysPcAddressHistoryMapper; private final GeoService geoService; private final SysUserService sysUserService; private static final String PC_GEO_KEY = "PCLocations"; @Resource private SysDeptMapper sysDeptMapper; @Override @Transactional(rollbackFor = Exception.class) public void saveSysPcAddress(IpInfoDto ipInfoDto, SysUser user) { SysPcAddress sysPcAddress = getById(user.getId()); if (sysPcAddress == null) { sysPcAddress = new SysPcAddress(); } SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper() .eq(SysDept::getId, user.getDeptId()).eq(SysDept::getDelFlag, 0)); sysPcAddress.setUserId(user.getId()); sysPcAddress.setUserName(user.getName()); sysPcAddress.setIp(ipInfoDto.getIp()); sysPcAddress.setLatitude(ipInfoDto.getLat()); sysPcAddress.setLongitude(ipInfoDto.getLng()); sysPcAddress.setProvince(ipInfoDto.getProv()); sysPcAddress.setCity(ipInfoDto.getCity()); sysPcAddress.setDistrict(ipInfoDto.getDistrict()); sysPcAddress.setSource(sysDept.getManagementSource()); sysPcAddress.setAddress(ipInfoDto.getProv() + ipInfoDto.getCity() + ipInfoDto.getDistrict()); sysPcAddress.setOperationTime(new Date()); sysPcAddress.setLeaderName(user.getLeaderName()); SysPcAddressHistory sysPcAddressHistory = new SysPcAddressHistory(); BeanUtils.copyProperties(sysPcAddress, sysPcAddressHistory); this.saveOrUpdate(sysPcAddress); sysPcAddressHistoryService.save(sysPcAddressHistory); } @Override public List getEveryone(SysPcAddressDto sysPcAddressDto) { List sysPcAddresses = sysPcAddressMapper.selectList(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince()) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity()) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict()) .in(SysPcAddress::getSource, Arrays.asList("1", "2")) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getSource()), SysPcAddress::getSource, sysPcAddressDto.getSource()) .orderByDesc(SysPcAddress::getOperationTime)); return sysPcAddresses; } @Override public List findLocationsWithinRadius(AdressRangeDto adressRangeDto) { geoService.addLocations(list(), PC_GEO_KEY); List nearbyIds = geoService.findNearbyIds(PC_GEO_KEY, adressRangeDto.getLongitude(), adressRangeDto.getLatitude(), adressRangeDto.getRadius()); if (nearbyIds.size() == 0) return new ArrayList<>(); geoService.move(nearbyIds, PC_GEO_KEY); return listByIds(nearbyIds); } @Override public SysPcAddressNumVo queryPcNum(SysPcAddressDto sysPcAddressDto) { SysPcAddressNumVo sysPcAddressNumVo = new SysPcAddressNumVo(); //区域数量统计 Long all = sysPcAddressMapper.selectCount(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince()) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity()) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict()) .in(SysPcAddress::getSource, Arrays.asList("1", "2"))); Long channelNum = sysPcAddressMapper.selectCount(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince()) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity()) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict()) .eq(SysPcAddress::getSource, 1)); Long proxyNum = sysPcAddressMapper.selectCount(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince()) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity()) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict()) .eq(SysPcAddress::getSource, 2)); Long onlineNum = sysPcAddressMapper.selectCount(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince()) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity()) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict()) .in(SysPcAddress::getSource, Arrays.asList("1", "2")).eq(SysPcAddress::getStatus, 1)); sysPcAddressNumVo.setAllNum(all); sysPcAddressNumVo.setProxyNum(proxyNum); sysPcAddressNumVo.setChannelNum(channelNum); sysPcAddressNumVo.setOnlineNum(onlineNum); return sysPcAddressNumVo; } @Override public List queryRegionInfo(SysPcAddressDto sysPcAddressDto) { List regionInfoVos = new ArrayList<>(); //全部:null 渠道:1 代理:2 List sysPcAddresses = sysPcAddressMapper.selectList(new LambdaQueryWrapper() .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince()) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity()) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict()) .in(SysPcAddress::getSource, Arrays.asList("1", "2")) .eq(StringUtils.isNotEmpty(sysPcAddressDto.getSource()), SysPcAddress::getSource, sysPcAddressDto.getSource())); if (CollectionUtil.isEmpty(sysPcAddresses)) return regionInfoVos; Map> map; if (CollectionUtil.isEmpty(sysPcAddresses)) return regionInfoVos; if (StringUtils.isEmpty(sysPcAddressDto.getProvince())) { map = sysPcAddresses.stream().collect(Collectors.groupingBy(SysPcAddress::getProvince)); } else { if (StringUtils.isNotEmpty(sysPcAddressDto.getCity())) { map = sysPcAddresses.stream().collect(Collectors.groupingBy(SysPcAddress::getDistrict)); } else { map = sysPcAddresses.stream().collect(Collectors.groupingBy(SysPcAddress::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 BasePageResult queryPcAddressInfo(PcAddressInfoDto addressInfoDto) { Page page = new Page<>(addressInfoDto.getPageNum(), addressInfoDto.getPageSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLng()), SysPcAddress::getLongitude, addressInfoDto.getLng()); wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLat()), SysPcAddress::getLatitude, addressInfoDto.getLat()); wrapper.in(SysPcAddress::getSource, Arrays.asList("1", "2")); wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getSource()), SysPcAddress::getSource, addressInfoDto.getSource()); wrapper.orderByDesc(SysPcAddress::getOperationTime); Page insOrdersPage = page(page, wrapper); return new BasePageResult<>(addressInfoDto.getPageNum(), page.getSize(), insOrdersPage.getTotal(), page.getPages(), insOrdersPage.getRecords()); } @Override public PcAddressHistoryInfoVo getPcAddress(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), "operation_time", dates) .in("source", Arrays.asList(1, 2)); Map result = sysPcAddressHistoryService.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 pcAddress = sysPcAddressHistoryMapper.getPcAddress(dates); pcAddressHistoryInfoVo.setList(pcAddress); return pcAddressHistoryInfoVo; } }