package com.xzx.gc.user.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.xzx.gc.common.Result; import com.xzx.gc.common.constant.CommonEnum; import com.xzx.gc.common.constant.Constants; import com.xzx.gc.common.constant.UserEnum; import com.xzx.gc.common.dto.gdmap.GdReverseGEODto; import com.xzx.gc.common.exception.RestException; import com.xzx.gc.common.utils.BusinessUtil; import com.xzx.gc.common.utils.gdmap.GdMapUtil; import com.xzx.gc.entity.*; import com.xzx.gc.model.admin.TargetUserModel; import com.xzx.gc.model.order.FenceDto; import com.xzx.gc.model.order.OrderInfoVo; import com.xzx.gc.user.dto.*; import com.xzx.gc.user.mapper.AddressMapper; import com.xzx.gc.user.mapper.UserTargetInfoMapper; import org.apache.commons.lang3.StringUtils; import org.locationtech.spatial4j.context.SpatialContext; import org.locationtech.spatial4j.distance.DistanceUtils; import org.locationtech.spatial4j.shape.Rectangle; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import tk.mybatis.mapper.entity.Example; import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.stream.Collectors; @Service @Transactional public class UserTargetInfoService { @Autowired private UserTargetInfoMapper userTargetInfoMapper; @Autowired private AddressMapper addressMapper; @Autowired private UserService userService; @Autowired private BusinessUtil businessUtil; @Autowired private HttpServletRequest request; @Autowired private OtherUserService otherUserService; @Autowired private OrderService orderService; @Autowired private AddressService addressService; @Autowired private FenceService fenceService; @Autowired private AddressLevelService addressLevelService; @Autowired private PartnerGaodeService partnerGaodeService; public void add(UserTargetInfo userTargetInfo) { userTargetInfo.setCreateTime(DateUtil.now()); userTargetInfo.setDelFlag(0); userTargetInfoMapper.insertSelective(userTargetInfo); } public UserTargetInfo findByMobileAndUserId(String mobile, String userId) { UserTargetInfo userTargetInfo = new UserTargetInfo(); userTargetInfo.setMobile(mobile); userTargetInfo.setUserId(userId); UserTargetInfo userTargetInfo1 = userTargetInfoMapper.selectOne(userTargetInfo); return userTargetInfo1; } public List findByMobile(String mobile) { UserTargetInfo userTargetInfo = new UserTargetInfo(); userTargetInfo.setMobile(mobile); List userTargetInfo1 = userTargetInfoMapper.select(userTargetInfo); if (!CollectionUtils.isEmpty(userTargetInfo1)) { List collect = userTargetInfo1.stream().sorted(Comparator.comparing(UserTargetInfo::getCreateTime).reversed()).collect(Collectors.toList()); return collect; } return userTargetInfo1; } public PageInfo find(UserTargetInfoFindDto userTargetInfoFindDto) { String userId = userTargetInfoFindDto.getUserId(); List userTargetInfo1 = null; String loginUserId = request.getHeader("userId"); String partnerId1 = otherUserService.findById(loginUserId).getPartnerId(); userTargetInfoFindDto.setPartnerId(partnerId1); userTargetInfoFindDto.setLoginUserId(loginUserId); PageHelper.startPage(userTargetInfoFindDto.getPageNo(), userTargetInfoFindDto.getPageSize()); userTargetInfo1 = userTargetInfoMapper.findPage(userTargetInfoFindDto); if (!CollectionUtils.isEmpty(userTargetInfo1)) { for (UserTargetInfo userTargetInfo : userTargetInfo1) { //如果是运营员 则不脱敏 否则若推广员或录入员是自己则不将手机号脱敏显示 String realUserId = userTargetInfo.getRealUserId(); String userId1 = userTargetInfo.getUserId(); //已成交 if (3 == userTargetInfo.getRegsterType()) { UserInfo byMobile = userService.findByMobile(userTargetInfo.getMobile()); if (byMobile != null) { //回收的累计重量 RecycleStatistic orderItemInfo = null; orderItemInfo = orderService.findOrderItemInfo(byMobile.getUserId(), 1); if (orderItemInfo != null) { userTargetInfo.setSumWeight(businessUtil.changeWeight(orderItemInfo.getWeightAll())); userTargetInfo.setSumWeightDouble(Convert.toDouble(businessUtil.changeWeight(orderItemInfo.getWeightAll()))); } else { userTargetInfo.setSumWeight(Constants.WEIGHT_INIT.toString()); } //上次成交的时间 List lastTimeBycreateUserId = orderService.findLastTimeBycreateUserId(byMobile.getUserId()); if (CollUtil.isNotEmpty(lastTimeBycreateUserId)) { String completeTime = lastTimeBycreateUserId.get(0).getCompleteTime(); if (StrUtil.isNotBlank(completeTime)) { String s = DateUtil.parseDate(completeTime).toString(); userTargetInfo.setLastTime(s); } } } else { userTargetInfo.setSumWeight(Constants.WEIGHT_INIT.toString()); } //以下为了排序使用 } else if (2 == userTargetInfo.getRegsterType()) { userTargetInfo.setSumWeight("-1"); userTargetInfo.setSumWeightDouble(Convert.toDouble(-1)); } else { userTargetInfo.setSumWeight("-2"); userTargetInfo.setSumWeightDouble(Convert.toDouble(-2)); } //判断当前用户是否自己推广 String queryUserId = StrUtil.isNotBlank(realUserId) ? realUserId : userId1; if (loginUserId.equals(queryUserId)) { userTargetInfo.setIsMe(true); } else { OtherUserInfo otherUserInfo = otherUserService.findById(queryUserId); if (otherUserInfo != null) { userTargetInfo.setRealUserName(otherUserInfo.getName()); } userTargetInfo.setIsMe(false); } if (!CommonEnum.运营员.getValue().equals(userTargetInfoFindDto.getUserType())) { if (!loginUserId.equals(userId1) && !loginUserId.equals(realUserId)) { String replace = businessUtil.changeMobile(userTargetInfo.getMobile()); userTargetInfo.setMobile(replace); } } } if ("4".equals(userTargetInfoFindDto.getOrderType())) { userTargetInfo1 = userTargetInfo1.stream().sorted(Comparator.comparingDouble(UserTargetInfo::getSumWeightDouble).reversed()).collect(Collectors.toList()); for (UserTargetInfo userTargetInfo : userTargetInfo1) { if (userTargetInfo.getSumWeight().equals("-1") || userTargetInfo.getSumWeight().equals("-2")) { userTargetInfo.setSumWeight(Constants.WEIGHT_INIT.toString()); } } } //置顶 List list = new ArrayList<>(); for (UserTargetInfo userTargetInfo : userTargetInfo1) { String topFlagUser = userTargetInfo.getTopFlagUser(); if (StrUtil.isNotBlank(topFlagUser) && topFlagUser.equals(loginUserId)) { list.add(userTargetInfo); } } if (CollUtil.isNotEmpty(list)) { for (UserTargetInfo userTargetInfo : userTargetInfo1) { String topFlagUser = userTargetInfo.getTopFlagUser(); if (StrUtil.isBlank(topFlagUser) || !topFlagUser.equals(loginUserId)) { userTargetInfo.setTopFlag(Convert.toShort(0)); list.add(userTargetInfo); } } userTargetInfo1 = list; } else { for (UserTargetInfo userTargetInfo : userTargetInfo1) { String topFlagUser = userTargetInfo.getTopFlagUser(); if (StrUtil.isBlank(topFlagUser) || !topFlagUser.equals(loginUserId)) { userTargetInfo.setTopFlag(Convert.toShort(0)); } } } } PageInfo pageInfo = new PageInfo<>(userTargetInfo1); return pageInfo; } public void update(UserTargetInfo userTargetInfo) { userTargetInfoMapper.updateByPrimaryKeySelective(userTargetInfo); } public UserTargetInfoStatisticResDto statistic(UserTargetInfoStatisticDto userTargetInfoStatisticDto) { UserTargetInfoStatisticResDto userTargetInfoStatisticResDto = new UserTargetInfoStatisticResDto(); Example example = new Example(UserTargetInfo.class); example.createCriteria().andEqualTo("userId", userTargetInfoStatisticDto.getUserId()); List userTargetInfos = userTargetInfoMapper.selectByExample(example); if (!CollectionUtils.isEmpty(userTargetInfos)) { userTargetInfoStatisticResDto.setNoRegisters(userTargetInfos.stream().filter(x -> x.getRegsterType() == 1).count()); userTargetInfoStatisticResDto.setNoOrders(userTargetInfos.stream().filter(x -> x.getRegsterType() == 2 && (x.getUserId() != null && x.getUserId().equals(userTargetInfoStatisticDto.getUserId()))).count()); userTargetInfoStatisticResDto.setOrders(userTargetInfos.stream().filter(x -> x.getRegsterType() == 3 && (x.getRealUserId() != null && x.getRealUserId().equals(userTargetInfoStatisticDto.getUserId()))).count()); userTargetInfoStatisticResDto.setSum(userTargetInfoStatisticResDto.getNoOrders() + userTargetInfoStatisticResDto.getOrders()); } return userTargetInfoStatisticResDto; } public void acode(UserTargetInfo userTargetInfo) { List byMobile = findByMobile(userTargetInfo.getMobile()); if (CollectionUtils.isEmpty(byMobile)) { userTargetInfo.setRegsterType(Convert.toInt(UserEnum.已注册.getValue())); userTargetInfo.setRealUserId(userTargetInfo.getUserId()); add(userTargetInfo); } else { //如果存在的同手机号已经被人推广了,则不做处理。 long count = byMobile.stream().filter(x -> x.getRealUserId() != null).count(); if (count == 0) { UserTargetInfo userTargetInfo1 = new UserTargetInfo(); userTargetInfo1.setRegsterType(Convert.toInt(UserEnum.已注册.getValue())); userTargetInfo1.setRealUserId(userTargetInfo.getUserId()); Example example = new Example(UserTargetInfo.class); example.createCriteria().andEqualTo("mobile", userTargetInfo.getMobile()); userTargetInfoMapper.updateByExampleSelective(userTargetInfo1, example); } } } public void updateTargetUserAddr(AddressInfo addressInfo) { UserInfo byId = userService.findById(addressInfo.getUserId()); UserTargetInfo userTargetInfo1 = new UserTargetInfo(); //赋值 userTargetInfo1.setLatitude(addressInfo.getLatitude()); userTargetInfo1.setLongitude(addressInfo.getLongitude()); userTargetInfo1.setAddressArea(addressInfo.getAddressArea()); userTargetInfo1.setDetailAddress(addressInfo.getDetailAddress()); userTargetInfo1.setProvinceId(addressInfo.getProvinceId()); userTargetInfo1.setCityId(addressInfo.getCityId()); userTargetInfo1.setTownshipId(addressInfo.getTownshipId()); Example example = new Example(UserTargetInfo.class); example.createCriteria().andEqualTo("mobile", byId.getMobilePhone()); userTargetInfoMapper.updateByExampleSelective(userTargetInfo1, example); } public void updateTargetUserLon(String mobile, String lon, String lan) { UserTargetInfo userTargetInfo1 = new UserTargetInfo(); userTargetInfo1.setLatitude(lan); userTargetInfo1.setLongitude(lon); Example example = new Example(UserTargetInfo.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("mobile", mobile); criteria.andIsNull("longitude"); userTargetInfoMapper.updateByExampleSelective(userTargetInfo1, example); } /** * 查询当前推广员成交的用户 * * @param userId * @return */ public List findOrderUser(String userId, String partnerId) { return userTargetInfoMapper.recommend(userId, partnerId); } public List map(UserTargetInfoMapDto userTargetInfoMapDto) { //判断当前用户所在的区域 和 当前所属合伙人的区域是否一致 String userId = request.getHeader("userId"); String partnerId1 = otherUserService.findById(userId).getPartnerId(); GdReverseGEODto gdReverseGEODto = new GdReverseGEODto(); gdReverseGEODto.setLocation(userTargetInfoMapDto.getLongitude() + "," + userTargetInfoMapDto.getLatitude()); Result areaInfo = GdMapUtil.getAreaInfo(gdReverseGEODto, 0); if (areaInfo.getCode() == 0) { AddressInfo addressInfo1 = (AddressInfo) areaInfo.getData(); AddressLevelInfo addressLevelInfo1 = addressLevelService.findByAdcode(addressInfo1.getAdcode()); if (addressLevelInfo1 != null) { String level3Id = addressLevelInfo1.getLevel3Id(); FenceDto fence = fenceService.getFence(level3Id, false, userTargetInfoMapDto.getLongitude(), userTargetInfoMapDto.getLatitude(), false); if(StrUtil.isBlank(fence.getFenceId())||!fence.getPartnerId().equals(partnerId1)){ throw new RestException(-1, "您已超出当前运营区域范围"); } } else { throw new RestException(-1, "基础数据异常,未查询到当前区域:" + addressInfo1.getAdcode()); } } else { throw new RestException(-1, "定位异常"); } List list = userService.findByDistance(); List resList = new ArrayList<>(); if (CollUtil.isNotEmpty(list)) { //如果当前合伙人不是天心区 则将无合伙人的用户删除 if (!Constants.DEFAULT_PARTNER_ID.equals(partnerId1)) { list.removeIf(x -> StrUtil.isBlank(x.getPartnerId())); } double lon = Convert.toDouble(userTargetInfoMapDto.getLongitude()); double lat = Convert.toDouble(userTargetInfoMapDto.getLatitude()); //单位千米 double radius = 0.5; SpatialContext geo = SpatialContext.GEO; Rectangle rectangle = geo.getDistCalc().calcBoxByDistFromPt(geo.makePoint(lon, lat), radius * DistanceUtils.KM_TO_DEG, geo, null); //筛选附近0.5公里的 for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { UserInfo userInfo = iterator.next(); if(StrUtil.isNotBlank(userInfo.getLatitude())) { double latitude = Convert.toDouble(userInfo.getLatitude(), Convert.toDouble(0)); double longitude = Convert.toDouble(userInfo.getLongitude(), Convert.toDouble(0)); if (NumberUtil.compare(latitude, rectangle.getMinY()) < 0) { iterator.remove(); } else if (NumberUtil.compare(latitude, rectangle.getMaxY()) > 0) { iterator.remove(); } else if (NumberUtil.compare(longitude, rectangle.getMinX()) < 0) { iterator.remove(); } else if (NumberUtil.compare(longitude, rectangle.getMaxX()) > 0) { iterator.remove(); } } } //进行分页 int currentPageNo = userTargetInfoMapDto.getPageNo() - 1; while (true) { //是否结束循环 boolean isOver = false; List pageList = null; try { pageList = new ArrayList<>(CollUtil.page(currentPageNo, userTargetInfoMapDto.getPageSize(), list)); } catch (Exception e) { return CollUtil.newArrayList(); } //最后一页的数据 if (pageList.size() < userTargetInfoMapDto.getPageSize()) { isOver = true; } //筛选是属于当前合伙人的用户 for (Iterator iterator = pageList.iterator(); iterator.hasNext(); ) { if (resList.size() == userTargetInfoMapDto.getPageSize()) { isOver = true; break; } UserInfo userInfo = iterator.next(); String partnerId = userInfo.getPartnerId(); if((Constants.DEFAULT_PARTNER_ID.equals(partnerId1)&&StrUtil.isBlank(partnerId))||partnerId.equals(partnerId1)){ resList.add(userInfo); }else { iterator.remove(); } } if (isOver) { break; } else { currentPageNo++; } } //设置用户状态 for (UserInfo userInfo : resList) { int byCreateTime = orderService.findByCreateTime(userInfo.getUserId(), null, -1); if (byCreateTime > 0) { userInfo.setRegsterType(Convert.toInt(UserEnum.已成交.getValue())); } else { userInfo.setRegsterType(Convert.toInt(UserEnum.已注册.getValue())); } } } return resList; } public Map queryList(TargetUserModel model){ if(!StringUtils.isEmpty(model.getRegsterType()) && model.getRegsterType().equals("2")){ model.setRegsterType1("3"); } Map m = new HashMap<>(); PageHelper.startPage(model.getPage(),model.getLimit()); List list = userTargetInfoMapper.queryList(model); PageInfo pageInfo=new PageInfo<>(list); m.put("data",list); m.put("count",pageInfo.getTotal()); m.put("code", 0); return m; } public Map queryListMap(TargetUserModel model){ if(!StringUtils.isEmpty(model.getRegsterType()) && model.getRegsterType().equals("2")){ model.setRegsterType1("3"); } Map m = new HashMap<>(); List list = userTargetInfoMapper.queryList(model); List userList = userTargetInfoMapper.queryUser(); for(TargetUserModel tum : userList){ if(StringUtils.isEmpty(tum.getOrderId())){ tum.setRegsterType("2"); }else{ tum.setRegsterType("3"); } } Map mx = new HashMap<>(); for(TargetUserModel tum : list){ mx.put(tum.getMobile(), tum); } for (TargetUserModel tum : userList){ mx.put(tum.getMobile(), tum); } Collection valueCollection2 = mx.values(); List valueList= new ArrayList(valueCollection2);//map转list m.put("data",valueList); m.put("count",valueList.size()); m.put("regCount",userList.size()); m.put("code", 0); return m; } }