SysGeographyPositionServiceImpl.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  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.core.metadata.IPage;
  7. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  8. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  9. import com.ydtech.modules.admin.dao.SysDeptMapper;
  10. import com.ydtech.modules.admin.dao.SysGeographyPositionMapper;
  11. import com.ydtech.modules.admin.dao.SysGeographyPositionRecordMapper;
  12. import com.ydtech.modules.admin.model.SysDept;
  13. import com.ydtech.modules.admin.model.SysGeographyPosition;
  14. import com.ydtech.modules.admin.model.SysGeographyPositionRecord;
  15. import com.ydtech.modules.admin.model.SysUser;
  16. import com.ydtech.modules.admin.model.dto.*;
  17. import com.ydtech.modules.admin.model.vo.*;
  18. import com.ydtech.modules.admin.service.GeoService;
  19. import com.ydtech.modules.admin.service.SysGeographyPositionRecordService;
  20. import com.ydtech.modules.admin.service.SysGeographyPositionService;
  21. import com.ydtech.modules.admin.service.SysUserService;
  22. import com.ydtech.modules.order.entity.BasePageResult;
  23. import com.ydtech.utils.StringUtils;
  24. import org.springframework.stereotype.Service;
  25. import javax.annotation.Resource;
  26. import java.text.ParseException;
  27. import java.text.SimpleDateFormat;
  28. import java.util.*;
  29. import java.util.stream.Collectors;
  30. @Service("SysGeographyPositionService")
  31. public class SysGeographyPositionServiceImpl extends ServiceImpl<SysGeographyPositionMapper, SysGeographyPosition> implements SysGeographyPositionService {
  32. @Resource
  33. private SysGeographyPositionMapper sysGeographyPositionMapper;
  34. @Resource
  35. private SysGeographyPositionRecordMapper sysGeographyPositionRecordMapper;
  36. @Resource
  37. private SysGeographyPositionRecordService sysGeographyPositionRecordService;
  38. @Resource
  39. private SysUserService sysUserService;
  40. @Resource
  41. private SysDeptMapper sysDeptMapper;
  42. @Resource
  43. private GeoService geoService;
  44. private static final String APP_GEO_KEY = "APPLocations";
  45. @Override
  46. public SysGeographyPositionVo queryPosition(SysGeographyPositionDto sysGeographyPositionDto) {
  47. SysGeographyPositionVo sysGeographyPositionVo = new SysGeographyPositionVo();
  48. List<SysGeographyPosition> list = sysGeographyPositionMapper.selectList(new LambdaQueryWrapper<SysGeographyPosition>()
  49. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  50. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  51. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  52. .in(SysGeographyPosition::getSource, Arrays.asList("1", "2"))
  53. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getSource()), SysGeographyPosition::getSource, sysGeographyPositionDto.getSource())
  54. .eq(sysGeographyPositionDto.getStatus() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus())
  55. .orderByDesc(SysGeographyPosition::getCreateTime));
  56. if (list.size() == 0) return new SysGeographyPositionVo();
  57. List<SysGeographyPositionInfoVo> sysGeographyPositionList = BeanUtil.copyToList(list, SysGeographyPositionInfoVo.class);
  58. //填充机构名
  59. for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : sysGeographyPositionList) {
  60. SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getId());
  61. if (sysUser == null) continue;
  62. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  63. .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0));
  64. if (sysDept == null) continue;
  65. sysGeographyPositionInfoVo.setDeptName(sysDept.getName());
  66. }
  67. sysGeographyPositionVo.setList(sysGeographyPositionList);
  68. Long aLong = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>().eq(SysGeographyPosition::getStatus, 1).in(SysGeographyPosition::getSource, Arrays.asList("1", "2")));
  69. sysGeographyPositionVo.setManNum(aLong);
  70. return sysGeographyPositionVo;
  71. }
  72. @Override
  73. public BasePageResult<SysGeographyPositionRecord> queryPositionList(SysGeographyPositionPageDto sysGeographyPositionPageDto) {
  74. Page<SysGeographyPositionRecord> page = new Page<>(sysGeographyPositionPageDto.getPageNum(), sysGeographyPositionPageDto.getPageSize());
  75. LambdaQueryWrapper<SysGeographyPositionRecord> wrapper = new LambdaQueryWrapper<>();
  76. wrapper.eq(StringUtils.isNotEmpty(sysGeographyPositionPageDto.getId()), SysGeographyPositionRecord::getUserId, sysGeographyPositionPageDto.getId());
  77. wrapper.orderByDesc(SysGeographyPositionRecord::getCreateTime);
  78. Page<SysGeographyPositionRecord> insOrdersPage = sysGeographyPositionRecordService.page(page, wrapper);
  79. return new BasePageResult<>(sysGeographyPositionPageDto.getPageNum(), page.getSize(), insOrdersPage.getTotal(), page.getPages(),
  80. insOrdersPage.getRecords());
  81. }
  82. @Override
  83. public SysPcAddressNumVo queryPcNum(SysGeographyPositionDto sysGeographyPositionDto) {
  84. SysPcAddressNumVo sysPcAddressNumVo = new SysPcAddressNumVo();
  85. Long all = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>()
  86. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  87. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  88. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  89. .in(SysGeographyPosition::getSource, Arrays.asList("1", "2"))
  90. .eq(sysGeographyPositionDto.getStatus() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus()));
  91. Long channelNum = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>()
  92. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  93. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  94. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  95. .eq(SysGeographyPosition::getSource, 1)
  96. .eq(sysGeographyPositionDto.getStatus() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus()));
  97. Long proxyNum = 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. .eq(SysGeographyPosition::getSource, 2)
  102. .eq(sysGeographyPositionDto.getStatus() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus()));
  103. Long onlineNum = sysGeographyPositionMapper.selectCount(new LambdaQueryWrapper<SysGeographyPosition>()
  104. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  105. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  106. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  107. .in(SysGeographyPosition::getSource, Arrays.asList("1", "2"))
  108. .eq(sysGeographyPositionDto.getStatus() == null, SysGeographyPosition::getStatus, 1)
  109. .eq(sysGeographyPositionDto.getStatus() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus()));
  110. sysPcAddressNumVo.setAllNum(all);
  111. sysPcAddressNumVo.setProxyNum(proxyNum);
  112. sysPcAddressNumVo.setChannelNum(channelNum);
  113. sysPcAddressNumVo.setOnlineNum(onlineNum);
  114. return sysPcAddressNumVo;
  115. }
  116. @Override
  117. public List<RegionInfoVo> queryRegionInfo(SysGeographyPositionDto sysGeographyPositionDto) {
  118. List<RegionInfoVo> regionInfoVos = new ArrayList<>();
  119. //全部:null 渠道:1 代理:2
  120. List<SysGeographyPosition> sysGeographyPositionList = sysGeographyPositionMapper.selectList(new LambdaQueryWrapper<SysGeographyPosition>()
  121. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getProvince()), SysGeographyPosition::getProvince, sysGeographyPositionDto.getProvince())
  122. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getCity()), SysGeographyPosition::getCity, sysGeographyPositionDto.getCity())
  123. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getDistrict()), SysGeographyPosition::getDistrict, sysGeographyPositionDto.getDistrict())
  124. .in(SysGeographyPosition::getSource, Arrays.asList("1", "2"))
  125. .eq(StringUtils.isNotEmpty(sysGeographyPositionDto.getSource()), SysGeographyPosition::getSource, sysGeographyPositionDto.getSource())
  126. .eq(sysGeographyPositionDto.getStatus() != null, SysGeographyPosition::getStatus, sysGeographyPositionDto.getStatus()));
  127. if (CollectionUtil.isEmpty(sysGeographyPositionList)) return regionInfoVos;
  128. Map<String, List<SysGeographyPosition>> map;
  129. if (StringUtils.isEmpty(sysGeographyPositionDto.getProvince())) {
  130. map = sysGeographyPositionList.stream().collect(Collectors.groupingBy(SysGeographyPosition::getProvince));
  131. } else {
  132. if (StringUtils.isNotEmpty(sysGeographyPositionDto.getCity())) {
  133. map = sysGeographyPositionList.stream().collect(Collectors.groupingBy(SysGeographyPosition::getDistrict));
  134. } else {
  135. map = sysGeographyPositionList.stream().collect(Collectors.groupingBy(SysGeographyPosition::getCity));
  136. }
  137. }
  138. for (Map.Entry<String, List<SysGeographyPosition>> entry : map.entrySet()) {
  139. RegionInfoVo regionInfoVo = new RegionInfoVo();
  140. regionInfoVo.setDistrictName(entry.getKey());
  141. regionInfoVo.setNumber(entry.getValue().size());
  142. regionInfoVos.add(regionInfoVo);
  143. }
  144. return regionInfoVos;
  145. }
  146. @Override
  147. public List<SysGeographyPositionInfoVo> findLocationsWithinRadius(AdressRangeDto adressRangeDto) {
  148. geoService.addLocationGeography(list(), APP_GEO_KEY);
  149. List<String> nearbyIds = geoService.findNearbyIds(APP_GEO_KEY, adressRangeDto.getLongitude(), adressRangeDto.getLatitude(), adressRangeDto.getRadius());
  150. if (nearbyIds.size() == 0) return new ArrayList<>();
  151. geoService.move(nearbyIds, APP_GEO_KEY);
  152. List<SysGeographyPosition> sysGeographyPositions = listByIds(nearbyIds);
  153. List<SysGeographyPositionInfoVo> sysGeographyPositionInfoVoList = BeanUtil.copyToList(sysGeographyPositions, SysGeographyPositionInfoVo.class);
  154. if (sysGeographyPositionInfoVoList.size() == 0) return sysGeographyPositionInfoVoList;
  155. for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : sysGeographyPositionInfoVoList) {
  156. SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getId());
  157. if (sysUser == null) continue;
  158. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  159. .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0));
  160. if (sysDept == null) continue;
  161. sysGeographyPositionInfoVo.setDeptName(sysDept.getName());
  162. }
  163. return sysGeographyPositionInfoVoList;
  164. }
  165. @Override
  166. public BasePageResult<SysGeographyPositionInfoVo> queryPcAddressInfo(PcAddressInfoDto addressInfoDto) {
  167. Page<SysGeographyPosition> page = new Page<>(addressInfoDto.getPageNum(), addressInfoDto.getPageSize());
  168. LambdaQueryWrapper<SysGeographyPosition> wrapper = new LambdaQueryWrapper<>();
  169. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLng()), SysGeographyPosition::getLongitude, addressInfoDto.getLng());
  170. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLat()), SysGeographyPosition::getLatitude, addressInfoDto.getLat());
  171. wrapper.in(SysGeographyPosition::getSource, Arrays.asList("1", "2"));
  172. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getSource()), SysGeographyPosition::getSource, addressInfoDto.getSource());
  173. wrapper.orderByDesc(SysGeographyPosition::getCreateTime);
  174. Page<SysGeographyPosition> insOrdersPage = page(page, wrapper);
  175. List<SysGeographyPosition> records = insOrdersPage.getRecords();
  176. List<SysGeographyPositionInfoVo> sysGeographyPositionList = BeanUtil.copyToList(records, SysGeographyPositionInfoVo.class);
  177. //填充机构名
  178. for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : sysGeographyPositionList) {
  179. SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getId());
  180. if (sysUser == null) continue;
  181. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  182. .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0));
  183. if (sysDept == null) continue;
  184. sysGeographyPositionInfoVo.setDeptName(sysDept.getName());
  185. }
  186. return new BasePageResult<>(addressInfoDto.getPageNum(), page.getSize(), insOrdersPage.getTotal(), page.getPages(),
  187. sysGeographyPositionList);
  188. }
  189. @Override
  190. public BasePageResult<SysGeographyPositionInfoVo> queryGeographyRecord(PcAddressInfoDto addressInfoDto) {
  191. Page page = new Page(addressInfoDto.getPageNum(), addressInfoDto.getPageSize());
  192. IPage<SysGeographyPositionInfoVo> sysGeographyPositionList = sysGeographyPositionRecordMapper.queryGeographyHistory(page,addressInfoDto);
  193. List<SysGeographyPositionInfoVo> records = sysGeographyPositionList.getRecords();
  194. //填充机构名
  195. for (SysGeographyPositionInfoVo sysGeographyPositionInfoVo : records) {
  196. SysUser sysUser = sysUserService.getById(sysGeographyPositionInfoVo.getUserId());
  197. if (sysUser == null) continue;
  198. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  199. .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0));
  200. if (sysDept == null) continue;
  201. sysGeographyPositionInfoVo.setDeptName(sysDept.getName());
  202. }
  203. return new BasePageResult<>(addressInfoDto.getPageNum(), addressInfoDto.getPageSize(), sysGeographyPositionList.getTotal(), sysGeographyPositionList.getPages(),
  204. records);
  205. }
  206. @Override
  207. public AppGeographyHistoryInfoVo getGeographyPosition(String startTime, String endTime, String source) {
  208. AppGeographyHistoryInfoVo appGeographyHistoryInfoVo = new AppGeographyHistoryInfoVo();
  209. if (StringUtils.isEmpty(startTime) || startTime.equals(endTime)) {
  210. if (StringUtils.isNullOrEmpty(startTime)) {
  211. Date date = new Date();
  212. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  213. startTime = simpleDateFormat.format(date);
  214. }
  215. QueryWrapper<SysGeographyPositionRecord> queryWrapper = new QueryWrapper<>();
  216. // 指定 COUNT(DISTINCT user_id) 查询
  217. queryWrapper.select("COUNT(DISTINCT user_id) AS total")
  218. .likeRight(StringUtils.isNotEmpty(startTime), "create_time", startTime)
  219. .in("source", Arrays.asList(1, 2))
  220. .eq(StringUtils.isNotEmpty(source),"source",source);;
  221. Map<String, Object> result = sysGeographyPositionRecordService.getMap(queryWrapper);
  222. Long total = (Long) result.get("total");
  223. appGeographyHistoryInfoVo.setOnlineNum(total);
  224. List<PcAddressHistoryTimeVo> geographyPosition = sysGeographyPositionRecordMapper.getGeographyPosition(startTime,source);
  225. appGeographyHistoryInfoVo.setList(geographyPosition);
  226. List<SysGeographyPositionRecord> sysGeographyPositionRecords =sysGeographyPositionRecordMapper.getGeographyPositionRecord(startTime,source);
  227. System.out.println("********************" + sysGeographyPositionRecords.size());
  228. appGeographyHistoryInfoVo.setPositionRecordList(sysGeographyPositionRecords);
  229. }else {
  230. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  231. startTime = startTime + " 00:00:01";
  232. endTime = endTime + " 23:59:59";
  233. try {
  234. Date parse = simpleDateFormat.parse(startTime);
  235. Date parse1 = simpleDateFormat.parse(endTime);
  236. startTime = simpleDateFormat.format(parse);
  237. endTime = simpleDateFormat.format(parse1);
  238. } catch (ParseException e) {
  239. throw new RuntimeException(e);
  240. }
  241. QueryWrapper<SysGeographyPositionRecord> queryWrapper = new QueryWrapper<>();
  242. queryWrapper.select("COUNT(DISTINCT user_id) AS total")
  243. .between("create_time", startTime, endTime)
  244. .in("source", Arrays.asList(1, 2))
  245. .eq(StringUtils.isNotEmpty(source),"source",source);;
  246. Map<String, Object> result = sysGeographyPositionRecordService.getMap(queryWrapper);
  247. Long total = (Long) result.get("total");
  248. appGeographyHistoryInfoVo.setOnlineNum(total);
  249. List<PcAddressHistoryTimeVo> geographyPosition = sysGeographyPositionRecordMapper.getGeographyPositionSection(startTime,endTime,source);
  250. appGeographyHistoryInfoVo.setList(geographyPosition);
  251. List<SysGeographyPositionRecord> sysGeographyPositionRecords =sysGeographyPositionRecordMapper.getGeographyPositionHistory(startTime,endTime,source);
  252. for (SysGeographyPositionRecord sysGeographyPositionRecord : sysGeographyPositionRecords) {
  253. SysUser sysUser = sysUserService.getById(sysGeographyPositionRecord.getUserId());
  254. if (sysUser == null) continue;
  255. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  256. .eq(SysDept::getId, sysUser.getDeptId()).eq(SysDept::getDelFlag, 0));
  257. if (sysDept == null) continue;
  258. sysGeographyPositionRecord.setDeptName(sysDept.getName());
  259. SysGeographyPosition sysGeographyPosition = sysGeographyPositionMapper.selectOne(new LambdaQueryWrapper<SysGeographyPosition>()
  260. .eq(SysGeographyPosition::getId,sysGeographyPositionRecord.getUserId()));
  261. sysGeographyPositionRecord.setLeaderName(sysGeographyPosition.getLeaderName());
  262. }
  263. System.out.println("********************" + sysGeographyPositionRecords.size());
  264. appGeographyHistoryInfoVo.setPositionRecordList(sysGeographyPositionRecords);
  265. }
  266. return appGeographyHistoryInfoVo;
  267. }
  268. @Override
  269. public List<SysGeographyPosition> getOnlinePeople() {
  270. return sysGeographyPositionMapper.selectList(new LambdaQueryWrapper<SysGeographyPosition>().eq(SysGeographyPosition::getStatus,1));
  271. }
  272. }