SysPcAddressServiceImpl.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  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.*;
  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.*;
  16. import com.ydtech.modules.admin.service.*;
  17. import com.ydtech.modules.base.controller.BaseController;
  18. import com.ydtech.modules.order.entity.BasePageResult;
  19. import com.ydtech.utils.StringUtils;
  20. import lombok.RequiredArgsConstructor;
  21. import org.springframework.beans.BeanUtils;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.transaction.annotation.Transactional;
  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. /**
  31. * @author Administrator
  32. * @description 针对表【sys_pc_address(pc获取ip地址)】的数据库操作Service实现
  33. * @createDate 2024-09-02 09:40:08
  34. */
  35. @Service
  36. @RequiredArgsConstructor
  37. public class SysPcAddressServiceImpl extends ServiceImpl<SysPcAddressMapper, SysPcAddress> implements SysPcAddressService {
  38. private final SysPcAddressHistoryService sysPcAddressHistoryService;
  39. private final SysPcAddressMapper sysPcAddressMapper;
  40. private final SysPcAddressHistoryMapper sysPcAddressHistoryMapper;
  41. private final GeoService geoService;
  42. private final SysUserService sysUserService;
  43. private static final String PC_GEO_KEY = "PCLocations";
  44. @Resource
  45. private SysDeptMapper sysDeptMapper;
  46. @Resource
  47. private SysDeptService sysDeptService;
  48. @Resource
  49. private SysUserMapper sysUserMapper;
  50. @Autowired
  51. private SysUserDeptRelationshipMapper sysUserDeptRelationshipMapper;
  52. @Override
  53. @Transactional(rollbackFor = Exception.class)
  54. public void saveSysPcAddress(IpInfoDto ipInfoDto, SysUser user) {
  55. SysPcAddress sysPcAddress = getById(user.getId());
  56. if (sysPcAddress == null) {
  57. sysPcAddress = new SysPcAddress();
  58. }
  59. SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
  60. .eq(SysDept::getId, user.getDeptId()).eq(SysDept::getDelFlag, 0));
  61. sysPcAddress.setUserId(user.getId());
  62. sysPcAddress.setUserName(user.getName());
  63. sysPcAddress.setIp(ipInfoDto.getIp());
  64. sysPcAddress.setLatitude(ipInfoDto.getLat());
  65. sysPcAddress.setLongitude(ipInfoDto.getLng());
  66. sysPcAddress.setProvince(ipInfoDto.getProv());
  67. sysPcAddress.setCity(ipInfoDto.getCity());
  68. sysPcAddress.setDistrict(ipInfoDto.getDistrict());
  69. sysPcAddress.setSource(sysDept.getManagementSource());
  70. sysPcAddress.setAddress(ipInfoDto.getProv() + ipInfoDto.getCity() + ipInfoDto.getDistrict());
  71. sysPcAddress.setOperationTime(new Date());
  72. sysPcAddress.setLeaderName(user.getLeaderName());
  73. SysPcAddressHistory sysPcAddressHistory = new SysPcAddressHistory();
  74. BeanUtils.copyProperties(sysPcAddress, sysPcAddressHistory);
  75. this.saveOrUpdate(sysPcAddress);
  76. sysPcAddressHistoryService.save(sysPcAddressHistory);
  77. }
  78. @Override
  79. public List<SysPcAddress> getEveryone(SysPcAddressDto sysPcAddressDto) {
  80. List<SysPcAddress> sysPcAddresses = null;
  81. // 类型:1。机构 2.用户
  82. if (sysPcAddressDto.getType() == 1) {
  83. sysPcAddresses = sysPcAddressMapper.selectList(new LambdaQueryWrapper<SysPcAddress>()
  84. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince())
  85. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity())
  86. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict())
  87. .in(SysPcAddress::getSource, Arrays.asList("1", "2"))
  88. .likeRight(StringUtils.isNotEmpty(sysPcAddressDto.getQueryId()), SysPcAddress::getUserId, sysPcAddressDto.getQueryId())
  89. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getSource()), SysPcAddress::getSource, sysPcAddressDto.getSource())
  90. .eq(sysPcAddressDto.getStatus() != null, SysPcAddress::getStatus, sysPcAddressDto.getStatus())
  91. .orderByDesc(SysPcAddress::getOperationTime));
  92. } else if (sysPcAddressDto.getType() == 2) {
  93. List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>()
  94. .eq(SysUser::getLeaderId, sysPcAddressDto.getQueryId()).ne(SysUser::getStatus, 0));
  95. List<String> collect = sysUsers.stream().map(SysUser::getId).collect(Collectors.toList());
  96. List<String> ids = new ArrayList<>();
  97. List<String> idList = queryList(collect, ids);
  98. collect.addAll(idList);
  99. if (collect.size() == 0) {
  100. return sysPcAddresses;
  101. }
  102. sysPcAddresses = sysPcAddressMapper.selectList(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. .in(SysPcAddress::getSource, Arrays.asList("1", "2"))
  107. .in(CollectionUtil.isNotEmpty(collect), SysPcAddress::getUserId, collect)
  108. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getSource()), SysPcAddress::getSource, sysPcAddressDto.getSource())
  109. .eq(sysPcAddressDto.getStatus() != null, SysPcAddress::getStatus, sysPcAddressDto.getStatus())
  110. .orderByDesc(SysPcAddress::getOperationTime));
  111. } else {
  112. sysPcAddresses = sysPcAddressMapper.selectList(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"))
  117. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getSource()), SysPcAddress::getSource, sysPcAddressDto.getSource())
  118. .eq(sysPcAddressDto.getStatus() != null, SysPcAddress::getStatus, sysPcAddressDto.getStatus())
  119. .orderByDesc(SysPcAddress::getOperationTime));
  120. }
  121. for (SysPcAddress sysPcAddress : sysPcAddresses) {
  122. SysUser sysUser = sysUserService.getById(sysPcAddress.getUserId());
  123. if (sysUser == null) continue;
  124. sysPcAddress.setLeaderName(sysUser.getLeaderName());
  125. }
  126. return sysPcAddresses;
  127. }
  128. private List<String> queryList(List<String> collect, List<String> ids) {
  129. if (collect.size() > 0) {
  130. for (String id : collect) {
  131. List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>()
  132. .eq(SysUser::getLeaderId, id).ne(SysUser::getStatus, 0));
  133. if (sysUsers.size() > 0) {
  134. List<String> list = sysUsers.stream().map(SysUser::getId).collect(Collectors.toList());
  135. ids.addAll(list);
  136. queryList(list, ids);
  137. }
  138. }
  139. }
  140. return ids;
  141. }
  142. @Override
  143. public List<SysPcAddress> findLocationsWithinRadius(AdressRangeDto adressRangeDto) {
  144. geoService.addLocations(list(), PC_GEO_KEY);
  145. List<String> nearbyIds = geoService.findNearbyIds(PC_GEO_KEY, adressRangeDto.getLongitude(), adressRangeDto.getLatitude(), adressRangeDto.getRadius());
  146. if (nearbyIds.size() == 0) return new ArrayList<>();
  147. geoService.move(nearbyIds, PC_GEO_KEY);
  148. return listByIds(nearbyIds);
  149. }
  150. @Override
  151. public SysPcAddressNumVo queryPcNum(SysPcAddressDto sysPcAddressDto) {
  152. SysPcAddressNumVo sysPcAddressNumVo = new SysPcAddressNumVo();
  153. //区域数量统计
  154. Long all = sysPcAddressMapper.selectCount(new LambdaQueryWrapper<SysPcAddress>()
  155. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince())
  156. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity())
  157. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict())
  158. .in(SysPcAddress::getSource, Arrays.asList("1", "2"))
  159. .eq(sysPcAddressDto.getStatus() != null, SysPcAddress::getStatus, sysPcAddressDto.getStatus()));
  160. Long channelNum = sysPcAddressMapper.selectCount(new LambdaQueryWrapper<SysPcAddress>()
  161. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince())
  162. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity())
  163. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict())
  164. .eq(SysPcAddress::getSource, 1)
  165. .eq(sysPcAddressDto.getStatus() != null, SysPcAddress::getStatus, sysPcAddressDto.getStatus()));
  166. Long proxyNum = sysPcAddressMapper.selectCount(new LambdaQueryWrapper<SysPcAddress>()
  167. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince())
  168. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity())
  169. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict())
  170. .eq(SysPcAddress::getSource, 2)
  171. .eq(sysPcAddressDto.getStatus() != null, SysPcAddress::getStatus, sysPcAddressDto.getStatus()));
  172. Long onlineNum = sysPcAddressMapper.selectCount(new LambdaQueryWrapper<SysPcAddress>()
  173. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince())
  174. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity())
  175. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict())
  176. .in(SysPcAddress::getSource, Arrays.asList("1", "2"))
  177. .eq(sysPcAddressDto.getStatus() == null, SysPcAddress::getStatus, 1)
  178. .eq(sysPcAddressDto.getStatus() != null, SysPcAddress::getStatus, sysPcAddressDto.getStatus()));
  179. sysPcAddressNumVo.setAllNum(all);
  180. sysPcAddressNumVo.setProxyNum(proxyNum);
  181. sysPcAddressNumVo.setChannelNum(channelNum);
  182. sysPcAddressNumVo.setOnlineNum(onlineNum);
  183. return sysPcAddressNumVo;
  184. }
  185. @Override
  186. public List<RegionInfoVo> queryRegionInfo(SysPcAddressDto sysPcAddressDto) {
  187. List<RegionInfoVo> regionInfoVos = new ArrayList<>();
  188. //全部:null 渠道:1 代理:2
  189. List<SysPcAddress> sysPcAddresses = sysPcAddressMapper.selectList(new LambdaQueryWrapper<SysPcAddress>()
  190. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getProvince()), SysPcAddress::getProvince, sysPcAddressDto.getProvince())
  191. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getCity()), SysPcAddress::getCity, sysPcAddressDto.getCity())
  192. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getDistrict()), SysPcAddress::getDistrict, sysPcAddressDto.getDistrict())
  193. .in(SysPcAddress::getSource, Arrays.asList("1", "2"))
  194. .eq(StringUtils.isNotEmpty(sysPcAddressDto.getSource()), SysPcAddress::getSource, sysPcAddressDto.getSource())
  195. .eq(sysPcAddressDto.getStatus() != null, SysPcAddress::getStatus, sysPcAddressDto.getStatus()));
  196. if (CollectionUtil.isEmpty(sysPcAddresses)) return regionInfoVos;
  197. Map<String, List<SysPcAddress>> map;
  198. if (CollectionUtil.isEmpty(sysPcAddresses)) return regionInfoVos;
  199. if (StringUtils.isEmpty(sysPcAddressDto.getProvince())) {
  200. map = sysPcAddresses.stream().collect(Collectors.groupingBy(SysPcAddress::getProvince));
  201. } else {
  202. if (StringUtils.isNotEmpty(sysPcAddressDto.getCity())) {
  203. map = sysPcAddresses.stream().collect(Collectors.groupingBy(SysPcAddress::getDistrict));
  204. } else {
  205. map = sysPcAddresses.stream().collect(Collectors.groupingBy(SysPcAddress::getCity));
  206. }
  207. }
  208. for (Map.Entry<String, List<SysPcAddress>> entry : map.entrySet()) {
  209. RegionInfoVo regionInfoVo = new RegionInfoVo();
  210. regionInfoVo.setDistrictName(entry.getKey());
  211. regionInfoVo.setNumber(entry.getValue().size());
  212. regionInfoVos.add(regionInfoVo);
  213. }
  214. return regionInfoVos;
  215. }
  216. @Override
  217. public BasePageResult<SysPcAddress> queryPcAddressInfo(PcAddressInfoDto addressInfoDto) {
  218. Page<SysPcAddress> page = new Page<>(addressInfoDto.getPageNum(), addressInfoDto.getPageSize());
  219. Page<SysPcAddress> insOrdersPage = null;
  220. // 类型:1。机构 2.用户
  221. if (addressInfoDto.getType() == 1) {
  222. LambdaQueryWrapper<SysPcAddress> wrapper = new LambdaQueryWrapper<>();
  223. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLng()), SysPcAddress::getLongitude, addressInfoDto.getLng());
  224. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLat()), SysPcAddress::getLatitude, addressInfoDto.getLat());
  225. wrapper.in(SysPcAddress::getSource, Arrays.asList("1", "2"));
  226. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getSource()), SysPcAddress::getSource, addressInfoDto.getSource());
  227. wrapper.likeRight(StringUtils.isNotEmpty(addressInfoDto.getQueryId()), SysPcAddress::getUserId, addressInfoDto.getQueryId());
  228. wrapper.eq(addressInfoDto.getStatus() != null, SysPcAddress::getStatus, addressInfoDto.getStatus());
  229. wrapper.orderByDesc(SysPcAddress::getOperationTime);
  230. insOrdersPage = page(page, wrapper);
  231. } else if (addressInfoDto.getType() == 2) {
  232. List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>()
  233. .eq(SysUser::getLeaderId, addressInfoDto.getQueryId()).ne(SysUser::getStatus, 0));
  234. List<String> collect = sysUsers.stream().map(SysUser::getId).collect(Collectors.toList());
  235. List<String> ids = new ArrayList<>();
  236. List<String> idList = queryList(collect, ids);
  237. collect.addAll(idList);
  238. if (collect.size() == 0) {
  239. return new BasePageResult<>(addressInfoDto.getPageNum(), page.getSize(), insOrdersPage.getTotal(), page.getPages(),
  240. insOrdersPage.getRecords());
  241. }
  242. LambdaQueryWrapper<SysPcAddress> wrapper = new LambdaQueryWrapper<>();
  243. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLng()), SysPcAddress::getLongitude, addressInfoDto.getLng());
  244. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLat()), SysPcAddress::getLatitude, addressInfoDto.getLat());
  245. wrapper.in(SysPcAddress::getSource, Arrays.asList("1", "2"));
  246. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getSource()), SysPcAddress::getSource, addressInfoDto.getSource());
  247. wrapper.eq(addressInfoDto.getStatus() != null, SysPcAddress::getStatus, addressInfoDto.getStatus());
  248. wrapper.orderByDesc(SysPcAddress::getOperationTime);
  249. insOrdersPage = page(page, wrapper);
  250. } else {
  251. LambdaQueryWrapper<SysPcAddress> wrapper = new LambdaQueryWrapper<>();
  252. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLng()), SysPcAddress::getLongitude, addressInfoDto.getLng());
  253. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getLat()), SysPcAddress::getLatitude, addressInfoDto.getLat());
  254. wrapper.in(SysPcAddress::getSource, Arrays.asList("1", "2"));
  255. wrapper.eq(StringUtils.isNotEmpty(addressInfoDto.getSource()), SysPcAddress::getSource, addressInfoDto.getSource());
  256. wrapper.eq(addressInfoDto.getStatus() != null, SysPcAddress::getStatus, addressInfoDto.getStatus());
  257. wrapper.orderByDesc(SysPcAddress::getOperationTime);
  258. insOrdersPage = page(page, wrapper);
  259. }
  260. return new BasePageResult<>(addressInfoDto.getPageNum(), page.getSize(), insOrdersPage.getTotal(), page.getPages(),
  261. insOrdersPage.getRecords());
  262. }
  263. @Override
  264. public PcAddressHistoryInfoVo getPcAddress(String startTime, String endTime, String source) {
  265. PcAddressHistoryInfoVo pcAddressHistoryInfoVo = new PcAddressHistoryInfoVo();
  266. if (StringUtils.isEmpty(startTime) || startTime.equals(endTime)) {
  267. if (StringUtils.isNullOrEmpty(startTime)) {
  268. Date date = new Date();
  269. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  270. startTime = simpleDateFormat.format(date);
  271. }
  272. QueryWrapper<SysPcAddressHistory> queryWrapper = new QueryWrapper<>();
  273. // 指定 COUNT(DISTINCT user_id) 查询
  274. queryWrapper.select("COUNT(DISTINCT user_id) AS total")
  275. .likeRight(StringUtils.isNotEmpty(startTime), "operation_time", startTime)
  276. .in("source", Arrays.asList(1, 2))
  277. .eq(StringUtils.isNotEmpty(source), "source", source);
  278. Map<String, Object> result = sysPcAddressHistoryService.getMap(queryWrapper);
  279. Long total = (Long) result.get("total");
  280. pcAddressHistoryInfoVo.setOnlineNum(total);
  281. List<PcAddressHistoryTimeVo> pcAddress = sysPcAddressHistoryMapper.getPcAddress(startTime, source);
  282. pcAddressHistoryInfoVo.setList(pcAddress);
  283. List<SysPcAddressHistory> sysPcAddressHistories = sysPcAddressHistoryMapper.getPcAddressInfo(startTime, source);
  284. extracted(sysPcAddressHistories);
  285. System.out.println("********************" + sysPcAddressHistories.size());
  286. pcAddressHistoryInfoVo.setPcAddressList(sysPcAddressHistories);
  287. } else {
  288. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  289. startTime = startTime + " 00:00:01";
  290. endTime = endTime + " 23:59:59";
  291. try {
  292. Date parse = simpleDateFormat.parse(startTime);
  293. Date parse1 = simpleDateFormat.parse(endTime);
  294. startTime = simpleDateFormat.format(parse);
  295. endTime = simpleDateFormat.format(parse1);
  296. } catch (ParseException e) {
  297. throw new RuntimeException(e);
  298. }
  299. QueryWrapper<SysPcAddressHistory> queryWrapper = new QueryWrapper<>();
  300. // 指定 COUNT(DISTINCT user_id) 查询
  301. queryWrapper.select("COUNT(DISTINCT user_id) AS total").between("operation_time", startTime, endTime)
  302. .in("source", Arrays.asList(1, 2)).eq(StringUtils.isNotEmpty(source), "source", source);
  303. Map<String, Object> result = sysPcAddressHistoryService.getMap(queryWrapper);
  304. Long total = (Long) result.get("total");
  305. pcAddressHistoryInfoVo.setOnlineNum(total);
  306. List<PcAddressHistoryTimeVo> pcAddress = sysPcAddressHistoryMapper.getPcAddressSection(startTime, endTime, source);
  307. pcAddressHistoryInfoVo.setList(pcAddress);
  308. List<SysPcAddressHistory> sysPcAddressHistories = sysPcAddressHistoryMapper.getPcAddressHistory(startTime, endTime, source);
  309. extracted(sysPcAddressHistories);
  310. System.out.println("********************" + sysPcAddressHistories.size());
  311. pcAddressHistoryInfoVo.setPcAddressList(sysPcAddressHistories);
  312. }
  313. return pcAddressHistoryInfoVo;
  314. }
  315. private void extracted(List<SysPcAddressHistory> sysPcAddressHistories) {
  316. for (SysPcAddressHistory sysPcAddressHistory : sysPcAddressHistories) {
  317. SysUser sysUser = sysUserService.getById(sysPcAddressHistory.getUserId());
  318. if (sysUser == null) continue;
  319. sysPcAddressHistory.setLeaderName(sysUser.getLeaderName());
  320. SysDept sysDept = sysDeptMapper.selectById(sysUser.getDeptId());
  321. if (sysDept == null) continue;
  322. sysPcAddressHistory.setDeptName(sysDept.getName());
  323. }
  324. }
  325. @Override
  326. public List<SysPcAddress> getOnlinePeople() {
  327. return sysPcAddressMapper.selectList(new LambdaQueryWrapper<SysPcAddress>().eq(SysPcAddress::getStatus, 1));
  328. }
  329. @Override
  330. public BasePageResult<SysPcAddressHistory> queryPcAddressHistoryInfo(PcAddressInfoDto addressInfoDto) {
  331. Page page = new Page(addressInfoDto.getPageNum(), addressInfoDto.getPageSize());
  332. IPage<SysPcAddressHistory> sysPcAddressHistoryIPage = sysPcAddressHistoryMapper.queryAddressHistory(page, addressInfoDto);
  333. return new BasePageResult<>(addressInfoDto.getPageNum(), addressInfoDto.getPageSize(), sysPcAddressHistoryIPage.getTotal(), sysPcAddressHistoryIPage.getPages(),
  334. sysPcAddressHistoryIPage.getRecords());
  335. }
  336. /**
  337. * 前线只要机构 后线人员(按照领导人) 机构
  338. *
  339. * @return
  340. */
  341. @Override
  342. public KztUserDeptTreeDto getUserDeptTree() {
  343. KztUserDeptTreeDto kztUserDeptTreeDto = new KztUserDeptTreeDto();
  344. String userId = BaseController.getUserId();
  345. List<SysDept> sysDeptList1 = sysDeptMapper.selectList(new LambdaQueryWrapper<SysDept>().eq(SysDept::getLeaderId, userId));
  346. if (sysDeptList1.size() > 0) {
  347. //展示机构
  348. kztUserDeptTreeDto.setType("1");
  349. } else {
  350. //展示机构 人员
  351. kztUserDeptTreeDto.setType("2"); //代理
  352. }
  353. SysUser byUserId = sysUserMapper.getByUserId(userId);
  354. List<SysDeptTreeVo> resultDeptList = this.getFiveLevelDeptKzt(byUserId);
  355. kztUserDeptTreeDto.setDeptList(resultDeptList);
  356. if (!userId.contains("M")) {
  357. if (sysDeptList1.size()==0) {
  358. List<SysUser> resultList = this.getUserTreeHx(byUserId);
  359. kztUserDeptTreeDto.setUserList(resultList);
  360. }
  361. }
  362. return kztUserDeptTreeDto;
  363. }
  364. private List<SysDeptTreeVo> getFiveLevelDeptKzt(SysUser byUserId) {
  365. SysDept sysDept = sysDeptService.getById("9");
  366. SysDept dept = sysDeptMapper.selectById(BaseController.getDeptId());
  367. SysDept sysDept1 = new SysDept();
  368. SysDeptVo sysDeptVo = new SysDeptVo();
  369. String id = byUserId.getId();
  370. List<String> deptIds = new ArrayList<>();
  371. if ("admin".equals(byUserId.getId())) {
  372. List<SysDept> sysDeptList = sysDeptMapper.queryFiveLevelDept(sysDeptVo);
  373. deptIds.addAll(sysDeptList.stream().map(SysDept::getId).collect(Collectors.toList()));
  374. } else {
  375. List<SysDept> sysDeptList1 = sysDeptMapper.selectList(new LambdaQueryWrapper<SysDept>().eq(SysDept::getLeaderId, id));
  376. if (sysDeptList1.size() > 0) {
  377. if (sysDeptList1.size() == 1) {
  378. SysDept sysDept2 = sysDeptList1.get(0);
  379. BeanUtil.copyProperties(sysDept2, sysDept1);
  380. deptIds = getDeptIds(sysDept2.getId(), deptIds, deptIds);
  381. } else {
  382. Optional<SysDept> max = sysDeptList1.stream().min((o1, o2) -> o1.getComlevel().compareTo(o2.getComlevel()));
  383. SysDept sysDept2 = max.get();
  384. BeanUtil.copyProperties(sysDept2, sysDept1);
  385. deptIds = getDeptIds(sysDept2.getId(), deptIds, deptIds);
  386. }
  387. } else {
  388. List<SysDept> sysDeptList = sysDeptMapper.queryFiveLevelDept(sysDeptVo);
  389. deptIds.addAll(sysDeptList.stream().map(SysDept::getId).collect(Collectors.toList()));
  390. }
  391. }
  392. sysDeptVo.setDeptIds(deptIds);
  393. List<SysDept> sysDeptList = sysDeptMapper.queryFiveLevelDept(sysDeptVo);
  394. if ("admin".equals(byUserId.getId())) {
  395. sysDept.setComlevel("1");
  396. sysDeptList.add(sysDept);
  397. }
  398. List<SysDeptTreeVo> sysDeptTreeVos = BeanUtil.copyToList(sysDeptList, SysDeptTreeVo.class);
  399. Map<String, List<SysDeptTreeVo>> map = sysDeptTreeVos.stream().sorted(Comparator.comparing(SysDeptTreeVo::getId))
  400. .collect(Collectors.groupingBy(SysDeptTreeVo::getParentId));
  401. sysDeptTreeVos.forEach(i -> {
  402. if (Integer.parseInt(i.getComlevel()) <= 5) {
  403. i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>()));
  404. i.setDeptCount(i.getChildren().size());
  405. }
  406. });
  407. if ("admin".equals(byUserId.getId())) {
  408. return map.get(BaseController.getDeptId());
  409. }
  410. List<SysDept> sysDeptList1 = sysDeptMapper.selectList(new LambdaQueryWrapper<SysDept>().eq(SysDept::getLeaderId, id));
  411. if (sysDeptList1.size() == 0) {
  412. return map.get(sysDept.getId());
  413. }
  414. String parentId = sysDept1.getParentId();
  415. if (parentId.equals("0")) {
  416. sysDept1.setParentId(sysDept1.getId());
  417. }
  418. return map.get(sysDept1.getParentId());
  419. }
  420. private List<String> getDeptIds(String deptId, List<String> ids, List<String> deptIds) {
  421. if (ids.size() > 0) {
  422. List<String> list = new ArrayList<>();
  423. for (String id : ids) {
  424. List<SysDept> sysDeptList = sysDeptMapper.selectList(new LambdaQueryWrapper<SysDept>().eq(SysDept::getParentId, id).isNotNull(SysDept::getComlevel));
  425. if (sysDeptList.size() > 0) {
  426. List<String> collect = sysDeptList.stream().map(SysDept::getId).collect(Collectors.toList());
  427. deptIds.addAll(sysDeptList.stream().map(SysDept::getId).collect(Collectors.toList()));
  428. list.addAll(collect);
  429. }
  430. }
  431. if (list.size() == 0) {
  432. return deptIds;
  433. } else {
  434. getDeptIds(deptId, list, deptIds);
  435. }
  436. } else {
  437. List<SysDept> sysDeptList = sysDeptMapper.selectList(new LambdaQueryWrapper<SysDept>().eq(SysDept::getParentId, deptId).isNotNull(SysDept::getComlevel));
  438. if (sysDeptList.size() > 0) {
  439. List<String> collect = sysDeptList.stream().map(SysDept::getId).collect(Collectors.toList());
  440. deptIds.add(deptId);
  441. deptIds.addAll(collect);
  442. getDeptIds(deptId, collect, deptIds);
  443. }
  444. }
  445. return deptIds;
  446. }
  447. private List<SysUser> getUserTreeHx(SysUser sysUser) {
  448. //获取领导字段不为空的人的ID
  449. QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
  450. queryWrapper.isNotNull("leader_id");
  451. List<SysUser> users = sysUserMapper.selectList(queryWrapper);
  452. if (users == null || users.size() == 0) {
  453. return new ArrayList<>();
  454. }
  455. List<SysUser> topUsers = new ArrayList<>(); //存放1级用户,即没有直接上级的用户
  456. // 根据组织结构展示级别,筛选顶层节点并构建组织结构树
  457. //topUsers.add(sysUserMapper.selectById("99D1501"));
  458. if ("admin".equals(sysUser.getName())) {
  459. topUsers.add(sysUserMapper.selectById("99D1501"));
  460. } else {
  461. topUsers.add(sysUser);
  462. }
  463. // 递归构建用户树结构
  464. buildUserTree(topUsers, users);
  465. return topUsers;
  466. }
  467. private void buildUserTree(List<SysUser> topUsers, List<SysUser> users) {
  468. for (SysUser user : topUsers) {
  469. List<SysUser> children = new ArrayList<>();
  470. for (SysUser childUser : users) {
  471. if (user.getId().equals(childUser.getLeaderId())) {
  472. children.add(childUser);
  473. // 递归查找下一级
  474. buildUserTree(children, users);
  475. }
  476. }
  477. user.setChildren(children);
  478. }
  479. }
  480. }