SysPcAddressServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package com.ydtech.modules.admin.service.impl;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.ydtech.modules.admin.dao.SysDeptMapper;
  8. import com.ydtech.modules.admin.dao.SysPcAddressHistoryMapper;
  9. import com.ydtech.modules.admin.dao.SysPcAddressMapper;
  10. import com.ydtech.modules.admin.model.SysDept;
  11. import com.ydtech.modules.admin.model.SysUser;
  12. import com.ydtech.modules.admin.model.dto.*;
  13. import com.ydtech.modules.admin.model.po.SysPcAddressHistory;
  14. import com.ydtech.modules.admin.model.po.SysPcAddress;
  15. import com.ydtech.modules.admin.model.vo.PcAddressHistoryInfoVo;
  16. import com.ydtech.modules.admin.model.vo.PcAddressHistoryTimeVo;
  17. import com.ydtech.modules.admin.model.vo.RegionInfoVo;
  18. import com.ydtech.modules.admin.service.GeoService;
  19. import com.ydtech.modules.admin.service.SysPcAddressHistoryService;
  20. import com.ydtech.modules.admin.service.SysPcAddressService;
  21. import com.ydtech.modules.admin.service.SysUserService;
  22. import com.ydtech.modules.order.entity.BasePageResult;
  23. import com.ydtech.utils.StringUtils;
  24. import lombok.RequiredArgsConstructor;
  25. import org.springframework.beans.BeanUtils;
  26. import org.springframework.stereotype.Service;
  27. import org.springframework.transaction.annotation.Transactional;
  28. import javax.annotation.Resource;
  29. import java.text.SimpleDateFormat;
  30. import java.util.*;
  31. import java.util.stream.Collectors;
  32. /**
  33. * @author Administrator
  34. * @description 针对表【sys_pc_address(pc获取ip地址)】的数据库操作Service实现
  35. * @createDate 2024-09-02 09:40:08
  36. */
  37. @Service
  38. @RequiredArgsConstructor
  39. public class SysPcAddressServiceImpl extends ServiceImpl<SysPcAddressMapper, SysPcAddress> implements SysPcAddressService {
  40. private final SysPcAddressHistoryService sysPcAddressHistoryService;
  41. private final SysPcAddressMapper sysPcAddressMapper;
  42. private final SysPcAddressHistoryMapper sysPcAddressHistoryMapper;
  43. private final GeoService geoService;
  44. private final SysUserService sysUserService;
  45. private static final String PC_GEO_KEY = "PCLocations";
  46. @Resource
  47. private SysDeptMapper sysDeptMapper;
  48. @Override
  49. @Transactional(rollbackFor = Exception.class)
  50. public void saveSysPcAddress(IpInfoDto ipInfoDto, SysUser user) {
  51. SysPcAddress sysPcAddress = getById(user.getId());
  52. if (sysPcAddress == null) {
  53. sysPcAddress = new SysPcAddress();
  54. }
  55. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  56. .eq(SysDept::getId, user.getDeptId()).eq(SysDept::getDelFlag, 0));
  57. sysPcAddress.setUserId(user.getId());
  58. sysPcAddress.setUserName(user.getName());
  59. sysPcAddress.setIp(ipInfoDto.getIp());
  60. sysPcAddress.setLatitude(ipInfoDto.getLat());
  61. sysPcAddress.setLongitude(ipInfoDto.getLng());
  62. sysPcAddress.setProvince(ipInfoDto.getProv());
  63. sysPcAddress.setCity(ipInfoDto.getCity());
  64. sysPcAddress.setDistrict(ipInfoDto.getDistrict());
  65. sysPcAddress.setSource(sysDept.getManagementSource());
  66. sysPcAddress.setAddress(ipInfoDto.getProv() + ipInfoDto.getCity() + ipInfoDto.getDistrict());
  67. sysPcAddress.setOperationTime(new Date());
  68. sysPcAddress.setLeaderName(user.getLeaderName());
  69. SysPcAddressHistory sysPcAddressHistory = new SysPcAddressHistory();
  70. BeanUtils.copyProperties(sysPcAddress, sysPcAddressHistory);
  71. this.saveOrUpdate(sysPcAddress);
  72. sysPcAddressHistoryService.save(sysPcAddressHistory);
  73. }
  74. @Override
  75. public List<SysPcAddress> getEveryone(SysPcAddressDto sysPcAddressDto) {
  76. List<SysPcAddress> sysPcAddresses = sysPcAddressMapper.selectList(new LambdaQueryWrapper<SysPcAddress>()
  77. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince())
  78. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity())
  79. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict())
  80. .in(SysPcAddress::getSource, Arrays.asList("1", "2"))
  81. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getSource()), SysPcAddress::getSource, sysPcAddressDto.getSource())
  82. .orderByDesc(SysPcAddress::getOperationTime));
  83. return sysPcAddresses;
  84. }
  85. @Override
  86. public List<SysPcAddress> findLocationsWithinRadius(AdressRangeDto adressRangeDto) {
  87. geoService.addLocations(list(), PC_GEO_KEY);
  88. List<String> nearbyIds = geoService.findNearbyIds(PC_GEO_KEY, adressRangeDto.getLongitude(), adressRangeDto.getLatitude(), adressRangeDto.getRadius());
  89. if (nearbyIds.size() == 0) return new ArrayList<>();
  90. geoService.move(nearbyIds, PC_GEO_KEY);
  91. return listByIds(nearbyIds);
  92. }
  93. @Override
  94. public SysPcAddressNumVo queryPcNum(SysPcAddressDto sysPcAddressDto) {
  95. SysPcAddressNumVo sysPcAddressNumVo = new SysPcAddressNumVo();
  96. //区域数量统计
  97. Long all = sysPcAddressMapper.selectCount(new LambdaQueryWrapper<SysPcAddress>()
  98. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince())
  99. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity())
  100. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict())
  101. .in(SysPcAddress::getSource, Arrays.asList("1", "2")));
  102. Long channelNum = sysPcAddressMapper.selectCount(new LambdaQueryWrapper<SysPcAddress>()
  103. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince())
  104. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity())
  105. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict())
  106. .eq(SysPcAddress::getSource, 1));
  107. Long proxyNum = sysPcAddressMapper.selectCount(new LambdaQueryWrapper<SysPcAddress>()
  108. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince())
  109. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity())
  110. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict())
  111. .eq(SysPcAddress::getSource, 2));
  112. Long onlineNum = sysPcAddressMapper.selectCount(new LambdaQueryWrapper<SysPcAddress>()
  113. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince())
  114. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity())
  115. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict())
  116. .in(SysPcAddress::getSource, Arrays.asList("1", "2")).eq(SysPcAddress::getStatus, 1));
  117. sysPcAddressNumVo.setAllNum(all);
  118. sysPcAddressNumVo.setProxyNum(proxyNum);
  119. sysPcAddressNumVo.setChannelNum(channelNum);
  120. sysPcAddressNumVo.setOnlineNum(onlineNum);
  121. return sysPcAddressNumVo;
  122. }
  123. @Override
  124. public List<RegionInfoVo> queryRegionInfo(SysPcAddressDto sysPcAddressDto) {
  125. List<RegionInfoVo> regionInfoVos = new ArrayList<>();
  126. //全部:null 渠道:1 代理:2
  127. List<SysPcAddress> sysPcAddresses = sysPcAddressMapper.selectList(new LambdaQueryWrapper<SysPcAddress>()
  128. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince())
  129. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity())
  130. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict())
  131. .in(SysPcAddress::getSource, Arrays.asList("1", "2"))
  132. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getSource()), SysPcAddress::getSource, sysPcAddressDto.getSource()));
  133. if (CollectionUtil.isEmpty(sysPcAddresses)) return regionInfoVos;
  134. Map<String, List<SysPcAddress>> map;
  135. if (CollectionUtil.isEmpty(sysPcAddresses)) return regionInfoVos;
  136. if (StringUtils.isEmpty(sysPcAddressDto.getProvince())) {
  137. map = sysPcAddresses.stream().collect(Collectors.groupingBy(SysPcAddress::getProvince));
  138. } else {
  139. if (StringUtils.isNotEmpty(sysPcAddressDto.getCity())) {
  140. map = sysPcAddresses.stream().collect(Collectors.groupingBy(SysPcAddress::getDistrict));
  141. } else {
  142. map = sysPcAddresses.stream().collect(Collectors.groupingBy(SysPcAddress::getCity));
  143. }
  144. }
  145. for (Map.Entry<String, List<SysPcAddress>> entry : map.entrySet()) {
  146. RegionInfoVo regionInfoVo = new RegionInfoVo();
  147. regionInfoVo.setDistrictName(entry.getKey());
  148. regionInfoVo.setNumber(entry.getValue().size());
  149. regionInfoVos.add(regionInfoVo);
  150. }
  151. return regionInfoVos;
  152. }
  153. @Override
  154. public BasePageResult<SysPcAddress> queryPcAddressInfo(PcAddressInfoDto addressInfoDto) {
  155. Page<SysPcAddress> page = new Page<>(addressInfoDto.getPageNum(), addressInfoDto.getPageSize());
  156. LambdaQueryWrapper<SysPcAddress> wrapper = new LambdaQueryWrapper<>();
  157. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLng()), SysPcAddress::getLongitude, addressInfoDto.getLng());
  158. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLat()), SysPcAddress::getLatitude, addressInfoDto.getLat());
  159. wrapper.in(SysPcAddress::getSource, Arrays.asList("1", "2"));
  160. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getSource()), SysPcAddress::getSource, addressInfoDto.getSource());
  161. wrapper.orderByDesc(SysPcAddress::getOperationTime);
  162. Page<SysPcAddress> insOrdersPage = page(page, wrapper);
  163. return new BasePageResult<>(addressInfoDto.getPageNum(), page.getSize(), insOrdersPage.getTotal(), page.getPages(),
  164. insOrdersPage.getRecords());
  165. }
  166. @Override
  167. public PcAddressHistoryInfoVo getPcAddress(String dates) {
  168. PcAddressHistoryInfoVo pcAddressHistoryInfoVo = new PcAddressHistoryInfoVo();
  169. QueryWrapper<SysPcAddressHistory> queryWrapper = new QueryWrapper<>();
  170. // 指定 COUNT(DISTINCT user_id) 查询
  171. queryWrapper.select("COUNT(DISTINCT user_id) AS total").likeRight(StringUtils.isNotEmpty(dates), "operation_time", dates)
  172. .in("source", Arrays.asList(1, 2));
  173. Map<String, Object> result = sysPcAddressHistoryService.getMap(queryWrapper);
  174. Long total = (Long) result.get("total");
  175. pcAddressHistoryInfoVo.setOnlineNum(total);
  176. if (StringUtils.isNullOrEmpty(dates)) {
  177. Date date = new Date();
  178. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  179. dates = simpleDateFormat.format(date);
  180. }
  181. List<PcAddressHistoryTimeVo> pcAddress = sysPcAddressHistoryMapper.getPcAddress(dates);
  182. pcAddressHistoryInfoVo.setList(pcAddress);
  183. return pcAddressHistoryInfoVo;
  184. }
  185. }