SysGeographyPositionServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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. .eq(sysGeographyPositionDto.getSource() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus())
  53. .orderByDesc(SysGeographyPosition::getCreateTime));
  54. if (list.size() == 0) return new SysGeographyPositionVo();
  55. List<SysGeographyPositionInfoVo> sysGeographyPositionList = BeanUtil.copyToList(list, SysGeographyPositionInfoVo.class);
  56. //填充机构名
  57. for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : sysGeographyPositionList) {
  58. SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getId());
  59. if (sysUser == null) continue;
  60. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  61. .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0));
  62. if (sysDept == null) continue;
  63. sysGeographyPositionInfoVo.setDeptName(sysDept.getName());
  64. }
  65. sysGeographyPositionVo.setList(sysGeographyPositionList);
  66. Long aLong = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>().eq(SysGeographyPosition::getStatus, 1).in(SysGeographyPosition::getSource, Arrays.asList("1", "2")));
  67. sysGeographyPositionVo.setManNum(aLong);
  68. return sysGeographyPositionVo;
  69. }
  70. @Override
  71. public BasePageResult<SysGeographyPositionRecord> queryPositionList(SysGeographyPositionPageDto sysGeographyPositionPageDto) {
  72. Page<SysGeographyPositionRecord> page = new Page<>(sysGeographyPositionPageDto.getPageNum(), sysGeographyPositionPageDto.getPageSize());
  73. LambdaQueryWrapper<SysGeographyPositionRecord> wrapper = new LambdaQueryWrapper<>();
  74. wrapper.eq(StringUtils.isNotEmpty(sysGeographyPositionPageDto.getId()), SysGeographyPositionRecord::getUserId, sysGeographyPositionPageDto.getId());
  75. wrapper.orderByDesc(SysGeographyPositionRecord::getCreateTime);
  76. Page<SysGeographyPositionRecord> insOrdersPage = sysGeographyPositionRecordService.page(page, wrapper);
  77. return new BasePageResult<>(sysGeographyPositionPageDto.getPageNum(), page.getSize(), insOrdersPage.getTotal(), page.getPages(),
  78. insOrdersPage.getRecords());
  79. }
  80. @Override
  81. public SysPcAddressNumVo queryPcNum(SysGeographyPositionDto sysGeographyPositionDto) {
  82. SysPcAddressNumVo sysPcAddressNumVo = new SysPcAddressNumVo();
  83. Long all = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>()
  84. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  85. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  86. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  87. .in(SysGeographyPosition::getSource, Arrays.asList("1", "2"))
  88. .eq(sysGeographyPositionDto.getSource() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus()));
  89. Long channelNum = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>()
  90. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  91. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  92. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  93. .eq(SysGeographyPosition::getSource, 1)
  94. .eq(sysGeographyPositionDto.getSource() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus()));
  95. Long proxyNum = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>()
  96. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  97. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  98. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  99. .eq(SysGeographyPosition::getSource, 2)
  100. .eq(sysGeographyPositionDto.getSource() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus()));
  101. Long onlineNum = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>()
  102. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  103. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  104. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  105. .in(SysGeographyPosition::getSource, Arrays.asList("1", "2"))
  106. .eq(sysGeographyPositionDto.getSource() == null, SysGeographyPosition::getStatus, 1)
  107. .eq(sysGeographyPositionDto.getSource() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus()));
  108. sysPcAddressNumVo.setAllNum(all);
  109. sysPcAddressNumVo.setProxyNum(proxyNum);
  110. sysPcAddressNumVo.setChannelNum(channelNum);
  111. sysPcAddressNumVo.setOnlineNum(onlineNum);
  112. return sysPcAddressNumVo;
  113. }
  114. @Override
  115. public List<RegionInfoVo> queryRegionInfo(SysGeographyPositionDto sysGeographyPositionDto) {
  116. List<RegionInfoVo> regionInfoVos = new ArrayList<>();
  117. //全部:null 渠道:1 代理:2
  118. List<SysGeographyPosition> sysGeographyPositionList = sysGeographyPositionMapper.selectList(new LambdaQueryWrapper<SysGeographyPosition>()
  119. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  120. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  121. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  122. .in(SysGeographyPosition::getSource, Arrays.asList("1", "2"))
  123. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getSource()), SysGeographyPosition::getSource, sysGeographyPositionDto.getSource())
  124. .eq(sysGeographyPositionDto.getSource() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus()));
  125. if (CollectionUtil.isEmpty(sysGeographyPositionList)) return regionInfoVos;
  126. Map<String, List<SysGeographyPosition>> map;
  127. if (StringUtils.isEmpty(sysGeographyPositionDto.getProvince())) {
  128. map = sysGeographyPositionList.stream().collect(Collectors.groupingBy(SysGeographyPosition::getProvince));
  129. } else {
  130. if (StringUtils.isNotEmpty(sysGeographyPositionDto.getCity())) {
  131. map = sysGeographyPositionList.stream().collect(Collectors.groupingBy(SysGeographyPosition::getDistrict));
  132. } else {
  133. map = sysGeographyPositionList.stream().collect(Collectors.groupingBy(SysGeographyPosition::getCity));
  134. }
  135. }
  136. for (Map.Entry<String, List<SysGeographyPosition>> entry : map.entrySet()) {
  137. RegionInfoVo regionInfoVo = new RegionInfoVo();
  138. regionInfoVo.setDistrictName(entry.getKey());
  139. regionInfoVo.setNumber(entry.getValue().size());
  140. regionInfoVos.add(regionInfoVo);
  141. }
  142. return regionInfoVos;
  143. }
  144. @Override
  145. public List<SysGeographyPositionInfoVo> findLocationsWithinRadius(AdressRangeDto adressRangeDto) {
  146. geoService.addLocationGeography(list(), APP_GEO_KEY);
  147. List<String> nearbyIds = geoService.findNearbyIds(APP_GEO_KEY, adressRangeDto.getLongitude(), adressRangeDto.getLatitude(), adressRangeDto.getRadius());
  148. if (nearbyIds.size() == 0) return new ArrayList<>();
  149. geoService.move(nearbyIds, APP_GEO_KEY);
  150. List<SysGeographyPosition> sysGeographyPositions = listByIds(nearbyIds);
  151. List<SysGeographyPositionInfoVo> sysGeographyPositionInfoVoList = BeanUtil.copyToList(sysGeographyPositions, SysGeographyPositionInfoVo.class);
  152. if (sysGeographyPositionInfoVoList.size() == 0) return sysGeographyPositionInfoVoList;
  153. for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : sysGeographyPositionInfoVoList) {
  154. SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getId());
  155. if (sysUser == null) continue;
  156. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  157. .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0));
  158. if (sysDept == null) continue;
  159. sysGeographyPositionInfoVo.setDeptName(sysDept.getName());
  160. }
  161. return sysGeographyPositionInfoVoList;
  162. }
  163. @Override
  164. public BasePageResult<SysGeographyPositionInfoVo> queryPcAddressInfo(PcAddressInfoDto addressInfoDto) {
  165. Page<SysGeographyPosition> page = new Page<>(addressInfoDto.getPageNum(), addressInfoDto.getPageSize());
  166. LambdaQueryWrapper<SysGeographyPosition> wrapper = new LambdaQueryWrapper<>();
  167. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLng()), SysGeographyPosition::getLongitude, addressInfoDto.getLng());
  168. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLat()), SysGeographyPosition::getLatitude, addressInfoDto.getLat());
  169. wrapper.in(SysGeographyPosition::getSource, Arrays.asList("1", "2"));
  170. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getSource()), SysGeographyPosition::getSource, addressInfoDto.getSource());
  171. wrapper.orderByDesc(SysGeographyPosition::getCreateTime);
  172. Page<SysGeographyPosition> insOrdersPage = page(page, wrapper);
  173. List<SysGeographyPosition> records = insOrdersPage.getRecords();
  174. List<SysGeographyPositionInfoVo> sysGeographyPositionList = BeanUtil.copyToList(records, SysGeographyPositionInfoVo.class);
  175. //填充机构名
  176. for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : sysGeographyPositionList) {
  177. SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getId());
  178. if (sysUser == null) continue;
  179. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  180. .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0));
  181. if (sysDept == null) continue;
  182. sysGeographyPositionInfoVo.setDeptName(sysDept.getName());
  183. }
  184. return new BasePageResult<>(addressInfoDto.getPageNum(), page.getSize(), insOrdersPage.getTotal(), page.getPages(),
  185. sysGeographyPositionList);
  186. }
  187. @Override
  188. public PcAddressHistoryInfoVo getGeographyPosition(String dates) {
  189. PcAddressHistoryInfoVo pcAddressHistoryInfoVo = new PcAddressHistoryInfoVo();
  190. QueryWrapper<SysGeographyPositionRecord> queryWrapper = new QueryWrapper<>();
  191. // 指定 COUNT(DISTINCT user_id) 查询
  192. queryWrapper.select("COUNT(DISTINCT user_id) AS total").likeRight(StringUtils.isNotEmpty(dates), "create_time", dates)
  193. .in("source", Arrays.asList(1, 2));
  194. Map<String, Object> result = sysGeographyPositionRecordService.getMap(queryWrapper);
  195. Long total = (Long) result.get("total");
  196. pcAddressHistoryInfoVo.setOnlineNum(total);
  197. if (StringUtils.isNullOrEmpty(dates)) {
  198. Date date = new Date();
  199. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  200. dates = simpleDateFormat.format(date);
  201. }
  202. List<PcAddressHistoryTimeVo> geographyPosition = sysGeographyPositionRecordMapper.getGeographyPosition(dates);
  203. pcAddressHistoryInfoVo.setList(geographyPosition);
  204. return pcAddressHistoryInfoVo;
  205. }
  206. @Override
  207. public List<SysGeographyPosition> getOnlinePeople() {
  208. return sysGeographyPositionMapper.selectList(new LambdaQueryWrapper<SysGeographyPosition>().eq(SysGeographyPosition::getStatus,1));
  209. }
  210. }