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<UserTargetInfo> findByMobile(String mobile) {
|
UserTargetInfo userTargetInfo = new UserTargetInfo();
|
userTargetInfo.setMobile(mobile);
|
List<UserTargetInfo> userTargetInfo1 = userTargetInfoMapper.select(userTargetInfo);
|
if (!CollectionUtils.isEmpty(userTargetInfo1)) {
|
List<UserTargetInfo> collect = userTargetInfo1.stream().sorted(Comparator.comparing(UserTargetInfo::getCreateTime).reversed()).collect(Collectors.toList());
|
return collect;
|
}
|
return userTargetInfo1;
|
}
|
|
|
public PageInfo<UserTargetInfo> find(UserTargetInfoFindDto userTargetInfoFindDto) {
|
String userId = userTargetInfoFindDto.getUserId();
|
List<UserTargetInfo> 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<OrderInfoVo> 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<UserTargetInfo> 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<UserTargetInfo> 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<UserTargetInfo> 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<UserTargetInfo> 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<UserTargetInfo> findOrderUser(String userId, String partnerId) {
|
return userTargetInfoMapper.recommend(userId, partnerId);
|
}
|
|
|
public List<UserInfo> 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<UserInfo> list = userService.findByDistance();
|
List<UserInfo> 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<UserInfo> 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<UserInfo> 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<UserInfo> 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<String, Object> queryList(TargetUserModel model){
|
if(!StringUtils.isEmpty(model.getRegsterType()) && model.getRegsterType().equals("2")){
|
model.setRegsterType1("3");
|
}
|
Map<String, Object> m = new HashMap<>();
|
PageHelper.startPage(model.getPage(),model.getLimit());
|
List<TargetUserModel> list = userTargetInfoMapper.queryList(model);
|
PageInfo<TargetUserModel> pageInfo=new PageInfo<>(list);
|
m.put("data",list);
|
m.put("count",pageInfo.getTotal());
|
m.put("code", 0);
|
return m;
|
}
|
public Map<String, Object> queryListMap(TargetUserModel model){
|
if(!StringUtils.isEmpty(model.getRegsterType()) && model.getRegsterType().equals("2")){
|
model.setRegsterType1("3");
|
}
|
Map<String, Object> m = new HashMap<>();
|
List<TargetUserModel> list = userTargetInfoMapper.queryList(model);
|
List<TargetUserModel> userList = userTargetInfoMapper.queryUser();
|
|
for(TargetUserModel tum : userList){
|
if(StringUtils.isEmpty(tum.getOrderId())){
|
tum.setRegsterType("2");
|
}else{
|
tum.setRegsterType("3");
|
}
|
}
|
|
Map<String, TargetUserModel> mx = new HashMap<>();
|
for(TargetUserModel tum : list){
|
mx.put(tum.getMobile(), tum);
|
}
|
for (TargetUserModel tum : userList){
|
mx.put(tum.getMobile(), tum);
|
}
|
|
Collection<TargetUserModel> valueCollection2 = mx.values();
|
List<TargetUserModel> valueList= new ArrayList<TargetUserModel>(valueCollection2);//map转list
|
|
m.put("data",valueList);
|
m.put("count",valueList.size());
|
m.put("regCount",userList.size());
|
m.put("code", 0);
|
return m;
|
}
|
}
|