SysGeographyPositionServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package com.ydtech.modules.admin.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollectionUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.ydtech.modules.admin.dao.SysDeptMapper;
  9. import com.ydtech.modules.admin.dao.SysGeographyPositionMapper;
  10. import com.ydtech.modules.admin.dao.SysGeographyPositionRecordMapper;
  11. import com.ydtech.modules.admin.model.SysDept;
  12. import com.ydtech.modules.admin.model.SysGeographyPosition;
  13. import com.ydtech.modules.admin.model.SysGeographyPositionRecord;
  14. import com.ydtech.modules.admin.model.SysUser;
  15. import com.ydtech.modules.admin.model.dto.*;
  16. import com.ydtech.modules.admin.model.vo.*;
  17. import com.ydtech.modules.admin.service.GeoService;
  18. import com.ydtech.modules.admin.service.SysGeographyPositionRecordService;
  19. import com.ydtech.modules.admin.service.SysGeographyPositionService;
  20. import com.ydtech.modules.admin.service.SysUserService;
  21. import com.ydtech.modules.order.entity.BasePageResult;
  22. import com.ydtech.utils.StringUtils;
  23. import org.springframework.stereotype.Service;
  24. import javax.annotation.Resource;
  25. import java.text.SimpleDateFormat;
  26. import java.util.*;
  27. import java.util.stream.Collectors;
  28. @Service("SysGeographyPositionService")
  29. public class SysGeographyPositionServiceImpl extends ServiceImpl<SysGeographyPositionMapper, SysGeographyPosition> implements SysGeographyPositionService {
  30. @Resource
  31. private SysGeographyPositionMapper sysGeographyPositionMapper;
  32. @Resource
  33. private SysGeographyPositionRecordMapper sysGeographyPositionRecordMapper;
  34. @Resource
  35. private SysGeographyPositionRecordService sysGeographyPositionRecordService;
  36. @Resource
  37. private SysUserService sysUserService;
  38. @Resource
  39. private SysDeptMapper sysDeptMapper;
  40. @Resource
  41. private GeoService geoService;
  42. private static final String APP_GEO_KEY = "APPLocations";
  43. @Override
  44. public SysGeographyPositionVo queryPosition(SysGeographyPositionDto sysGeographyPositionDto) {
  45. SysGeographyPositionVo sysGeographyPositionVo = new SysGeographyPositionVo();
  46. List<SysGeographyPosition> list = sysGeographyPositionMapper.selectList(new LambdaQueryWrapper<SysGeographyPosition>()
  47. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  48. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  49. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  50. .in(SysGeographyPosition::getSource, Arrays.asList("1", "2"))
  51. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getSource()), SysGeographyPosition::getSource, sysGeographyPositionDto.getSource())
  52. .orderByDesc(SysGeographyPosition::getCreateTime));
  53. if (list.size() == 0) return new SysGeographyPositionVo();
  54. List<SysGeographyPositionInfoVo> sysGeographyPositionList = BeanUtil.copyToList(list, SysGeographyPositionInfoVo.class);
  55. //填充机构名
  56. for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : sysGeographyPositionList) {
  57. SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getId());
  58. if (sysUser == null) continue;
  59. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  60. .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0));
  61. if (sysDept == null) continue;
  62. sysGeographyPositionInfoVo.setDeptName(sysDept.getName());
  63. }
  64. sysGeographyPositionVo.setList(sysGeographyPositionList);
  65. Long aLong = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>().eq(SysGeographyPosition::getStatus, 1).in(SysGeographyPosition::getSource, Arrays.asList("1", "2")));
  66. sysGeographyPositionVo.setManNum(aLong);
  67. return sysGeographyPositionVo;
  68. }
  69. @Override
  70. public BasePageResult<SysGeographyPositionRecord> queryPositionList(SysGeographyPositionPageDto sysGeographyPositionPageDto) {
  71. Page<SysGeographyPositionRecord> page = new Page<>(sysGeographyPositionPageDto.getPageNum(), sysGeographyPositionPageDto.getPageSize());
  72. LambdaQueryWrapper<SysGeographyPositionRecord> wrapper = new LambdaQueryWrapper<>();
  73. wrapper.eq(StringUtils.isNotEmpty(sysGeographyPositionPageDto.getId()), SysGeographyPositionRecord::getUserId, sysGeographyPositionPageDto.getId());
  74. wrapper.orderByDesc(SysGeographyPositionRecord::getCreateTime);
  75. Page<SysGeographyPositionRecord> insOrdersPage = sysGeographyPositionRecordService.page(page, wrapper);
  76. return new BasePageResult<>(sysGeographyPositionPageDto.getPageNum(), page.getSize(), insOrdersPage.getTotal(), page.getPages(),
  77. insOrdersPage.getRecords());
  78. }
  79. @Override
  80. public SysPcAddressNumVo queryPcNum(SysGeographyPositionDto sysGeographyPositionDto) {
  81. SysPcAddressNumVo sysPcAddressNumVo = new SysPcAddressNumVo();
  82. Long all = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>()
  83. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  84. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  85. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  86. .in(SysGeographyPosition::getSource, Arrays.asList("1", "2")));
  87. Long channelNum = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>()
  88. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  89. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  90. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  91. .eq(SysGeographyPosition::getSource, 1));
  92. Long proxyNum = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>()
  93. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  94. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  95. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  96. .eq(SysGeographyPosition::getSource, 2));
  97. Long onlineNum = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>()
  98. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  99. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  100. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  101. .in(SysGeographyPosition::getSource, Arrays.asList("1", "2")).eq(SysGeographyPosition::getStatus, 1));
  102. sysPcAddressNumVo.setAllNum(all);
  103. sysPcAddressNumVo.setProxyNum(proxyNum);
  104. sysPcAddressNumVo.setChannelNum(channelNum);
  105. sysPcAddressNumVo.setOnlineNum(onlineNum);
  106. return sysPcAddressNumVo;
  107. }
  108. @Override
  109. public List<RegionInfoVo> queryRegionInfo(SysGeographyPositionDto sysGeographyPositionDto) {
  110. List<RegionInfoVo> regionInfoVos = new ArrayList<>();
  111. //全部:null 渠道:1 代理:2
  112. List<SysGeographyPosition> sysGeographyPositionList = sysGeographyPositionMapper.selectList(new LambdaQueryWrapper<SysGeographyPosition>()
  113. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  114. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  115. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  116. .in(SysGeographyPosition::getSource, Arrays.asList("1", "2"))
  117. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getSource()), SysGeographyPosition::getSource, sysGeographyPositionDto.getSource()));
  118. if (CollectionUtil.isEmpty(sysGeographyPositionList)) return regionInfoVos;
  119. Map<String, List<SysGeographyPosition>> map;
  120. if (StringUtils.isEmpty(sysGeographyPositionDto.getProvince())) {
  121. map = sysGeographyPositionList.stream().collect(Collectors.groupingBy(SysGeographyPosition::getProvince));
  122. } else {
  123. if (StringUtils.isNotEmpty(sysGeographyPositionDto.getCity())) {
  124. map = sysGeographyPositionList.stream().collect(Collectors.groupingBy(SysGeographyPosition::getDistrict));
  125. } else {
  126. map = sysGeographyPositionList.stream().collect(Collectors.groupingBy(SysGeographyPosition::getCity));
  127. }
  128. }
  129. for (Map.Entry<String, List<SysGeographyPosition>> entry : map.entrySet()) {
  130. RegionInfoVo regionInfoVo = new RegionInfoVo();
  131. regionInfoVo.setDistrictName(entry.getKey());
  132. regionInfoVo.setNumber(entry.getValue().size());
  133. regionInfoVos.add(regionInfoVo);
  134. }
  135. return regionInfoVos;
  136. }
  137. @Override
  138. public List<SysGeographyPositionInfoVo> findLocationsWithinRadius(AdressRangeDto adressRangeDto) {
  139. geoService.addLocationGeography(list(), APP_GEO_KEY);
  140. List<String> nearbyIds = geoService.findNearbyIds(APP_GEO_KEY, adressRangeDto.getLongitude(), adressRangeDto.getLatitude(), adressRangeDto.getRadius());
  141. if (nearbyIds.size() == 0) return new ArrayList<>();
  142. geoService.move(nearbyIds, APP_GEO_KEY);
  143. List<SysGeographyPosition> sysGeographyPositions = listByIds(nearbyIds);
  144. List<SysGeographyPositionInfoVo> sysGeographyPositionInfoVoList = BeanUtil.copyToList(sysGeographyPositions, SysGeographyPositionInfoVo.class);
  145. if (sysGeographyPositionInfoVoList.size() == 0) return sysGeographyPositionInfoVoList;
  146. for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : sysGeographyPositionInfoVoList) {
  147. SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getId());
  148. if (sysUser == null) continue;
  149. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  150. .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0));
  151. if (sysDept == null) continue;
  152. sysGeographyPositionInfoVo.setDeptName(sysDept.getName());
  153. }
  154. return sysGeographyPositionInfoVoList;
  155. }
  156. @Override
  157. public BasePageResult<SysGeographyPositionInfoVo> queryPcAddressInfo(PcAddressInfoDto addressInfoDto) {
  158. Page<SysGeographyPosition> page = new Page<>(addressInfoDto.getPageNum(), addressInfoDto.getPageSize());
  159. LambdaQueryWrapper<SysGeographyPosition> wrapper = new LambdaQueryWrapper<>();
  160. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLng()), SysGeographyPosition::getLongitude, addressInfoDto.getLng());
  161. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLat()), SysGeographyPosition::getLatitude, addressInfoDto.getLat());
  162. wrapper.in(SysGeographyPosition::getSource, Arrays.asList("1", "2"));
  163. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getSource()), SysGeographyPosition::getSource, addressInfoDto.getSource());
  164. wrapper.orderByDesc(SysGeographyPosition::getCreateTime);
  165. Page<SysGeographyPosition> insOrdersPage = page(page, wrapper);
  166. List<SysGeographyPosition> records = insOrdersPage.getRecords();
  167. List<SysGeographyPositionInfoVo> sysGeographyPositionList = BeanUtil.copyToList(records, SysGeographyPositionInfoVo.class);
  168. //填充机构名
  169. for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : sysGeographyPositionList) {
  170. SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getId());
  171. if (sysUser == null) continue;
  172. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  173. .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0));
  174. if (sysDept == null) continue;
  175. sysGeographyPositionInfoVo.setDeptName(sysDept.getName());
  176. }
  177. return new BasePageResult<>(addressInfoDto.getPageNum(), page.getSize(), insOrdersPage.getTotal(), page.getPages(),
  178. sysGeographyPositionList);
  179. }
  180. @Override
  181. public PcAddressHistoryInfoVo getGeographyPosition(String dates) {
  182. PcAddressHistoryInfoVo pcAddressHistoryInfoVo = new PcAddressHistoryInfoVo();
  183. QueryWrapper<SysGeographyPositionRecord> queryWrapper = new QueryWrapper<>();
  184. // 指定 COUNT(DISTINCT user_id) 查询
  185. queryWrapper.select("COUNT(DISTINCT user_id) AS total").likeRight(StringUtils.isNotEmpty(dates), "create_time", dates)
  186. .in("source", Arrays.asList(1, 2));
  187. Map<String, Object> result = sysGeographyPositionRecordService.getMap(queryWrapper);
  188. Long total = (Long) result.get("total");
  189. pcAddressHistoryInfoVo.setOnlineNum(total);
  190. if (StringUtils.isNullOrEmpty(dates)) {
  191. Date date = new Date();
  192. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  193. dates = simpleDateFormat.format(date);
  194. }
  195. List<PcAddressHistoryTimeVo> geographyPosition = sysGeographyPositionRecordMapper.getGeographyPosition(dates);
  196. pcAddressHistoryInfoVo.setList(geographyPosition);
  197. return pcAddressHistoryInfoVo;
  198. }
  199. }