package com.xzx.gc.user.service;
|
|
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.date.DateTime;
|
import cn.hutool.core.date.DateUnit;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.lang.Snowflake;
|
import cn.hutool.core.util.*;
|
import cn.hutool.core.util.RandomUtil;
|
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageInfo;
|
import com.xzx.gc.common.Result;
|
import com.xzx.gc.common.constant.*;
|
import com.xzx.gc.common.exception.RestException;
|
import com.xzx.gc.common.utils.*;
|
import com.xzx.gc.entity.*;
|
import com.xzx.gc.model.admin.PartnerAccountModel;
|
import com.xzx.gc.model.admin.PromoterModel;
|
import com.xzx.gc.model.admin.StorageModel;
|
import com.xzx.gc.model.admin.UserModel;
|
import com.xzx.gc.model.order.FenceDto;
|
import com.xzx.gc.model.user.*;
|
import com.xzx.gc.user.dto.LoginPwdResDto;
|
import com.xzx.gc.user.dto.UpdatePwdDto;
|
import com.xzx.gc.user.mapper.*;
|
import com.xzx.gc.util.DoubleUtil;
|
import org.apache.commons.codec.binary.Base64;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.validation.annotation.Validated;
|
import org.springframework.web.bind.annotation.RequestBody;
|
import tk.mybatis.mapper.entity.Example;
|
|
import java.math.BigDecimal;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
@Service
|
@Transactional
|
public class OtherUserService {
|
|
@Autowired
|
private OtherUserMapper otherUserMapper;
|
|
@Autowired
|
private OrderMapper orderMapper;
|
|
@Autowired
|
private RedisUtil redisUtil;
|
|
@Autowired
|
private BusinessUtil businessUtil;
|
|
@Autowired
|
private OrderStorageInfoMapper orderStorageInfoMapper;
|
|
@Autowired
|
private CityPartnerService cityPartnerService;
|
|
@Autowired
|
private PartnerAccountService partnerAccountService;
|
|
@Autowired
|
private PartnerAccountMapper partnerAccountMapper;
|
|
@Autowired
|
private AccountService accountService;
|
|
@Autowired
|
private AddressService addressService;
|
|
@Autowired
|
private UserMapper userMapper;
|
|
@Autowired
|
private PartnerGaodeService partnerGaodeService;
|
|
@Autowired
|
private UserGatherInfoService userGatherInfoService;
|
|
@Autowired
|
private SysItemPriceMapper sysItemPriceMapper;
|
|
@Autowired
|
private SysEnvironmentalInfoService sysEnvironmentalInfoService;
|
|
@Autowired
|
private OrderService orderService;
|
|
@Autowired
|
private OrderAppraiseInfoMapper orderAppraiseInfoMapper;
|
|
@Autowired
|
private PartnerFenceService partnerFenceService;
|
|
@Autowired
|
private ConfigService configService;
|
|
public List<OtherUserInfo> findByUserTypeAndPartner(String userType,String partered) {
|
OtherUserInfo otherUserInfo=new OtherUserInfo();
|
otherUserInfo.setDelFlag(0);
|
otherUserInfo.setIsProhibit(false);
|
otherUserInfo.setUserType(userType);
|
otherUserInfo.setPartnerId(partered);
|
return otherUserMapper.select(otherUserInfo);
|
}
|
|
public List<OtherUserInfo> findByUserTypeAndFenceIdForNotLeave(String fenceId) {
|
return otherUserMapper.findByUserTypeAndFenceIdForNotLeave(fenceId);
|
}
|
|
public List<OtherUserInfo> findByUserTypeAndPartnerIdForNotLeave(String partnerId) {
|
return otherUserMapper.findByUserTypeAndPartnerIdForNotLeave(partnerId);
|
}
|
|
|
public List<OtherUserInfo> findByUserType(String userType) {
|
OtherUserInfo otherUserInfo=new OtherUserInfo();
|
otherUserInfo.setDelFlag(0);
|
otherUserInfo.setIsProhibit(false);
|
otherUserInfo.setUserType(userType);
|
List<OtherUserInfo> select = otherUserMapper.select(otherUserInfo);
|
return select;
|
}
|
|
|
public List<OtherUserInfo> findByMobile(String mobile) {
|
OtherUserInfo otherUserInfo=new OtherUserInfo();
|
otherUserInfo.setDelFlag(Constants.DEL_NOT_FLAG);
|
otherUserInfo.setIsProhibit(false);
|
otherUserInfo.setMobilePhone(mobile);
|
List<OtherUserInfo> select = otherUserMapper.select(otherUserInfo);
|
return select;
|
}
|
|
public List<OtherUserInfo> findByMobileForBidden(String mobile) {
|
OtherUserInfo otherUserInfo=new OtherUserInfo();
|
otherUserInfo.setDelFlag(Constants.DEL_NOT_FLAG);
|
otherUserInfo.setMobilePhone(mobile);
|
List<OtherUserInfo> select = otherUserMapper.select(otherUserInfo);
|
return select;
|
}
|
|
|
public List<OtherUserInfo> findByOpenId(String openId) {
|
OtherUserInfo otherUserInfo=new OtherUserInfo();
|
otherUserInfo.setDelFlag(Constants.DEL_NOT_FLAG);
|
otherUserInfo.setIsProhibit(false);
|
otherUserInfo.setOpenId(openId);
|
List<OtherUserInfo> select = otherUserMapper.select(otherUserInfo);
|
return select;
|
}
|
|
|
public LoginPwdResDto findByMobileAndPwd(String mobile, String pwd) {
|
LoginPwdResDto loginPwdResDto=new LoginPwdResDto();
|
List<OtherUserInfo> list = findByMobileForBidden(mobile);
|
if(CollUtil.isNotEmpty(list)){
|
if(list.size()>1){
|
throw new RestException("一个手机号不能存在多个角色");
|
}
|
OtherUserInfo byMobileAndUserType=null;
|
|
// long hs=list.stream().filter(x->CommonEnum.回收员.getValue().equals(x.getUserType())).count();
|
// long rk=list.stream().filter(x->CommonEnum.入库员.getValue().equals(x.getUserType())).count();
|
// long yy=list.stream().filter(x->CommonEnum.运营员.getValue().equals(x.getUserType())).count();
|
// long tg=list.stream().filter(x->CommonEnum.推广员.getValue().equals(x.getUserType())).count();
|
// long dbyy=list.stream().filter(x->CommonEnum.打包站运营员.getValue().equals(x.getUserType())).count();
|
// long db=list.stream().filter(x->CommonEnum.打包员.getValue().equals(x.getUserType())).count();
|
// long admin=list.stream().filter(x->CommonEnum.总部管理员.getValue().equals(x.getUserType())).count();
|
//
|
//
|
//
|
// //运营员互斥规则
|
// if(yy+db+dbyy>=2){
|
// throw new RestException(-1,"运营员角色与打包员角色不能共存");
|
// }
|
//
|
// //回收员互斥规则
|
// if(hs+rk>=2){
|
// throw new RestException(-1,"回收员角色与入库员角色不能共存");
|
// }
|
//
|
// if(hs+db+dbyy>=2){
|
// throw new RestException(-1,"回收员角色与打包员角色不能共存");
|
// }
|
//
|
// //入库员互斥规则
|
// if(rk+hs>=2){
|
// throw new RestException(-1,"入库员角色与回收员角色不能共存");
|
// }
|
// if(rk+db+dbyy>=2){
|
// throw new RestException(-1,"入库员角色与打包员角色不能共存");
|
// }
|
//
|
//
|
// //角色优先级
|
// List<OtherUserInfo> collect;
|
// if(admin==1) {
|
// collect = list.stream().filter(x -> CommonEnum.总部管理员.getValue().equals(x.getUserType())).collect(Collectors.toList());
|
// }else if(hs==1){
|
// collect = list.stream().filter(x -> CommonEnum.回收员.getValue().equals(x.getUserType())).collect(Collectors.toList());
|
// }else if(rk==1){
|
// collect = list.stream().filter(x -> CommonEnum.入库员.getValue().equals(x.getUserType())).collect(Collectors.toList());
|
// }else if(dbyy==1){
|
// collect = list.stream().filter(x -> CommonEnum.打包站运营员.getValue().equals(x.getUserType())).collect(Collectors.toList());
|
// }else if(db==1){
|
// collect = list.stream().filter(x -> CommonEnum.打包员.getValue().equals(x.getUserType())).collect(Collectors.toList());
|
// }else if(tg==1){
|
// collect = list.stream().filter(x -> CommonEnum.推广员.getValue().equals(x.getUserType())).collect(Collectors.toList());
|
// }else if(yy==1){
|
// collect = list.stream().filter(x->CommonEnum.运营员.getValue().equals(x.getUserType())).collect(Collectors.toList());
|
// }else {
|
// collect = list;
|
// }
|
byMobileAndUserType=list.get(0);
|
|
if(byMobileAndUserType.getIsProhibit()){
|
loginPwdResDto.setFlag(-1);
|
return loginPwdResDto;
|
}
|
|
String encrypt = SecurityUtil.encrypt(byMobileAndUserType.getSalt(), pwd);
|
if(encrypt.equals(byMobileAndUserType.getPassword())){
|
BeanUtils.copyProperties(byMobileAndUserType,loginPwdResDto);
|
loginPwdResDto.setSalt(null);
|
loginPwdResDto.setPassword(null);
|
List<String> collect1 = list.stream().filter(x->x.getIsProhibit()==false).map(x -> x.getUserType()).collect(Collectors.toList());
|
loginPwdResDto.setUserTypeList(collect1);
|
return loginPwdResDto;
|
}else{
|
loginPwdResDto.setFlag(-2);
|
}
|
}else{
|
loginPwdResDto.setFlag(-3);
|
}
|
return loginPwdResDto;
|
}
|
|
|
public OtherUserInfo findByMobileAndUserType(String mobile, String userType) {
|
OtherUserInfo otherUserInfo=new OtherUserInfo();
|
otherUserInfo.setDelFlag(0);
|
otherUserInfo.setUserType(userType);
|
otherUserInfo.setMobilePhone(mobile);
|
OtherUserInfo select = otherUserMapper.selectOne(otherUserInfo);
|
return select;
|
}
|
|
|
public void add(OtherUserInfo otherUserInfo) {
|
otherUserInfo.setRegistTime(DateUtil.now());
|
otherUserInfo.setDelFlag(0);
|
otherUserMapper.insertSelective(otherUserInfo);
|
}
|
|
|
public OtherUserInfo findById(String userId) {
|
return otherUserMapper.selectByPrimaryKey(userId);
|
}
|
|
|
|
public void update(OtherUserInfo otherUserInfo){
|
otherUserMapper.updateByPrimaryKeySelective(otherUserInfo);
|
}
|
|
|
public void updateOpenIdByMobile(String openId,String mobile) {
|
Example example=new Example(OtherUserInfo.class);
|
example.createCriteria().andEqualTo("mobilePhone",mobile)
|
.andEqualTo("isProhibit",Constants.DEL_NOT_FLAG)
|
.andEqualTo("delFlag",Constants.DEL_NOT_FLAG);
|
OtherUserInfo otherUserInfo1=new OtherUserInfo();
|
otherUserInfo1.setOpenId(openId);
|
otherUserMapper.updateByExampleSelective(otherUserInfo1,example);
|
}
|
|
|
/**
|
* 查询平台用户
|
* @param userType 支持多个
|
* @param id 排除id
|
* @param parenId 合伙人id
|
* @param keyword 关键字查询
|
* @return
|
*/
|
public List<OtherUserInfo> findByUserTypeNotId(String userType, String id,String parenId,String keyword) {
|
Example example=new Example(OtherUserInfo.class);
|
Example.Criteria criteria = example.createCriteria();
|
criteria.andEqualTo("delFlag",0);
|
criteria.andEqualTo("isProhibit",0);
|
criteria.andIn("userType", Arrays.asList(userType.split(",")));
|
if(StrUtil.isNotBlank(parenId)) {
|
criteria.andEqualTo("partnerId", parenId);
|
}
|
if(StrUtil.isNotBlank(id)){
|
criteria.andNotIn("userId",CollUtil.newArrayList(id));
|
}
|
|
if(StrUtil.isNotBlank(keyword)){
|
example.and().orLike("name","%"+keyword+"%").orLike("mobilePhone","%"+keyword+"%");
|
}
|
|
example.setOrderByClause("user_type asc");
|
List<OtherUserInfo> select = otherUserMapper.selectByExample(example);
|
return select;
|
}
|
|
|
/**
|
* 修改密码
|
* @param updatePwdDto
|
* @param result
|
* @param mobile
|
*/
|
public void pwdUpdate(@Validated @RequestBody UpdatePwdDto updatePwdDto, Result result, String mobile) {
|
String redisVerifyCode = redisUtil.get(Constants.REDIS_USER_KEY+"code:" + mobile);
|
if(StringUtils.isBlank(redisVerifyCode)){
|
result.setCode(-1);
|
result.setMsg("验证码已经失效,有效期两分钟");
|
}else if(!redisVerifyCode.equals(updatePwdDto.getCode())){
|
result.setCode(-1);
|
result.setMsg("验证码错误");
|
}else if(!updatePwdDto.getNewPwd().equals(updatePwdDto.getNewPwdSure())){
|
result.setCode(-1);
|
result.setMsg("两次密码不一致");
|
}else{
|
OtherUserInfo otherUserInfo = new OtherUserInfo();
|
otherUserInfo.setSalt(RandomUtil.randomString(16));
|
otherUserInfo.setPassword(SecurityUtil.encrypt(otherUserInfo.getSalt(),updatePwdDto.getNewPwd()));
|
Example example=new Example(OtherUserInfo.class);
|
Example.Criteria criteria = example.createCriteria();
|
criteria.andEqualTo("mobilePhone",mobile);
|
otherUserMapper.updateByExampleSelective(otherUserInfo,example);
|
}
|
}
|
|
|
public void delCuserById(String id, String phone, String userType){
|
|
AccountInfo account = accountService.findByUserIdForbidden(id);
|
if(account!=null) {
|
if (null == account.getOverdraftLimit() && "".equals(account.getOverdraftLimit())) {
|
account.setOverdraftLimit("0");
|
}
|
BigDecimal overLimit = Convert.toBigDecimal(account.getOverdraftLimit(), Constants.MONEY_INIT);
|
//要把可用余额加入到合伙人
|
OtherUserInfo userModel1 = findById(id);
|
if (null != userModel1) {
|
if (overLimit.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
if (null != userModel1.getPartnerId()) {
|
//调整额度时需要扣除合伙人额度
|
String partnerId = userModel1.getPartnerId();
|
CityPartner partner = cityPartnerService.findById(Convert.toInt(partnerId));
|
PartnerAccountModel partnerAccountModel = partnerAccountMapper.getPartnerAccountByUserId(partner.getUserId());
|
Snowflake snowflake = IdUtil.getSnowflake(0, 3);
|
String payOrderId = "ZF" + snowflake.nextIdStr();
|
partnerAccountModel.setAddType("1");
|
partnerAccountService.insertPartnerAccountLog(partnerAccountModel, "8", overLimit, payOrderId, "7");
|
BigDecimal newPartnerMoney = new BigDecimal(partnerAccountModel.getHbb()).add(overLimit);
|
partnerAccountModel.setHbb(DoubleUtil.roundTwo(newPartnerMoney.toString()));
|
partnerAccountMapper.updatePartnerAccount(partnerAccountModel);
|
}
|
}
|
}
|
}
|
|
// 删除user_info
|
OtherUserInfo otherUserInfo=new OtherUserInfo();
|
otherUserInfo.setUserId(id);
|
otherUserInfo.setDelFlag(Constants.DEL_FLAG);
|
update(otherUserInfo);
|
// 删除account
|
accountService.deleteByUserId(id);
|
if(userType.equals("普通用户")){
|
// 删除地址
|
addressService.deleteByUserId(id);
|
}
|
// 删除redis token
|
UserModel userModel = userMapper.queryUserByUsertype(phone, "1", "0",null,null);
|
redisUtil.remove("xzx:user:token:"+id);
|
if(null!=userModel){
|
redisUtil.remove("xzx:user:token:"+userModel.getUserId());
|
}
|
|
List<Map<String, Object>> userIdList = otherUserMapper.queryCuserByPhoneRedisDelList(phone);
|
for (Map<String,Object> map:userIdList) {
|
String userId = map.get("userId").toString();
|
redisUtil.remove("xzx:user:token:"+userId);
|
}
|
redisUtil.remove(phone);
|
}
|
|
|
public Map<String,Object> queryStorageByUserId(StorageModel storageModel) {
|
List<String> partnerIds = cityPartnerService.queryPartnerByCurrent();
|
if(null!=storageModel.getStartTime()&&!"".equals(storageModel.getStartTime())){
|
storageModel.setStartTime(storageModel.getStartTime()+" 00:00:00");
|
}
|
if(null!=storageModel.getEndTime()&&!"".equals(storageModel.getEndTime())){
|
storageModel.setEndTime(storageModel.getEndTime()+" 23:59:59");
|
}
|
storageModel.setPartnerIds(partnerIds);
|
PageHelper.startPage(storageModel.getPage(),storageModel.getLimit());
|
List<StorageModel> list = otherUserMapper.queryStorageByUserId(storageModel);
|
PageInfo<StorageModel> pageInfo=new PageInfo<>(list);
|
for (StorageModel model:list) {
|
if(null!=model.getRecycleWeight()&&!"".equals(model.getRecycleWeight())){
|
model.setRecycleWeight(DoubleUtil.roundThree(model.getRecycleWeight()));
|
}else{
|
model.setRecycleWeight("0");
|
}
|
if(null!=model.getRecycleMoney()&&!"".equals(model.getRecycleMoney())){
|
model.setRecycleMoney(DoubleUtil.roundTwo(model.getRecycleMoney()));
|
}else{
|
model.setRecycleMoney("0");
|
}
|
model.setWeightError(DoubleUtil.roundThree(model.getWeightError()));
|
model.setMoneyError(DoubleUtil.roundTwo(model.getMoneyError()));
|
}
|
Map<String,Object> result = new HashMap<>();
|
result.put("data", list);
|
result.put("count", pageInfo.getTotal());
|
result.put("code", 0);
|
return result;
|
}
|
|
public Map<String, Object> queryStorageList(UserModel userModel){
|
List<String> partnerIds = new ArrayList<>();
|
if(null!=userModel.getPartnerId()&&!"".equals(userModel.getPartnerId())){
|
partnerIds.add(userModel.getPartnerId());
|
}else{
|
partnerIds = cityPartnerService.queryPartnerByCurrent();
|
}
|
userModel.setPartnerIds(partnerIds);
|
if(!org.apache.commons.lang3.StringUtils.isEmpty(userModel.getName())){
|
userModel.setName(userModel.getName());
|
userModel.setMobilePhone(userModel.getName());
|
}
|
String startTime = userModel.getStartTime();
|
String endTime = userModel.getEndTime();
|
if(null!=startTime&&!"".equals(startTime)){
|
startTime = startTime+" 00:00:00";
|
}
|
if(null!=endTime&&!"".equals(endTime)){
|
endTime = endTime+" 23:59:59";
|
}
|
|
userModel.setStartTime(startTime);
|
userModel.setEndTime(endTime);
|
Map<String, Object> result = new HashMap<>();
|
PageHelper.startPage(userModel.getPage(),userModel.getLimit());
|
List<Map<String,Object>> storageList = otherUserMapper.queryStorageList(userModel);
|
PageInfo<Map<String,Object>> pageInfo=new PageInfo<>(storageList);
|
for (Map<String,Object> map:storageList) {
|
map.put("recycleweight",DoubleUtil.roundThree(map.get("recycleWeight").toString()) );
|
map.put("storageweight",DoubleUtil.roundThree(map.get("storageWeight").toString()));
|
map.put("recyclemoney",DoubleUtil.roundTwo(map.get("recycleMoney").toString()));
|
map.put("storagemoney",DoubleUtil.roundTwo(map.get("storageMoney").toString()));
|
map.put("storageuserphone",map.get("storageUserPhone").toString());
|
map.put("storagename",map.get("storageName").toString());
|
String orderId = map.get("orderId").toString();
|
map.put("orderNum",orderId);
|
}
|
result.put("storageNum",pageInfo.getTotal());
|
result.put("data", storageList);
|
result.put("count", pageInfo.getTotal());
|
result.put("code", 0);
|
return result;
|
}
|
|
public Map<String, Object> queryPackageStorageList(UserModel userModel){
|
List<String> partnerIds = new ArrayList<>();
|
if(null!=userModel.getPartnerId()&&!"".equals(userModel.getPartnerId())){
|
partnerIds.add(userModel.getPartnerId());
|
|
}else{
|
partnerIds = cityPartnerService.queryPartnerByCurrent();
|
}
|
|
List<String> townIds = new ArrayList<>();
|
if(null!=partnerIds&&partnerIds.size()>0){
|
String partnerId= partnerIds.get(0);
|
List<PartnerGaode> byPartnerId = partnerGaodeService.findByPartnerId(partnerId);
|
if(CollUtil.isNotEmpty(byPartnerId)){
|
townIds=byPartnerId.stream().map(x->x.getTownId()).collect(Collectors.toList());
|
}
|
|
List<CityPartner> packageIdByPartnerId = cityPartnerService.findPackageIdByPartnerId(partnerId);
|
if(CollUtil.isNotEmpty(packageIdByPartnerId)){
|
partnerIds=packageIdByPartnerId.stream().map(x->x.getId().toString()).collect(Collectors.toList());
|
}
|
|
}
|
userModel.setPartnerIds(partnerIds);
|
|
String nickName=null;
|
if(!org.apache.commons.lang3.StringUtils.isEmpty(userModel.getName())){
|
userModel.setName(userModel.getName());
|
userModel.setMobilePhone(userModel.getName());
|
}
|
String startTime = userModel.getStartTime();
|
String endTime = userModel.getEndTime();
|
if(null!=startTime&&!"".equals(startTime)){
|
startTime = startTime+" 00:00:00";
|
}
|
if(null!=endTime&&!"".equals(endTime)){
|
endTime = endTime+" 23:59:59";
|
}
|
|
userModel.setStartTime(startTime);
|
userModel.setEndTime(endTime);
|
int storageNum=0;
|
if(townIds.size()==0){
|
storageNum=otherUserMapper.queryPackageStorageNum(null);
|
}else{
|
storageNum=otherUserMapper.queryPackageStorageNum(townIds);
|
}
|
Map<String, Object> result = new HashMap<>();
|
userModel.setUserType("7");
|
PageHelper.startPage(userModel.getPage(),userModel.getLimit());
|
List<Map<String,Object>> storageList = otherUserMapper.queryStorageList1(userModel);
|
PageInfo<Map<String,Object>> pageInfo=new PageInfo<>(storageList);
|
for (Map<String,Object> map:storageList) {
|
map.put("recycleweight",DoubleUtil.roundThree(map.get("recycleWeight").toString()) );
|
map.put("storageweight",DoubleUtil.roundThree(map.get("storageWeight").toString()));
|
map.put("recyclemoney",DoubleUtil.roundTwo(map.get("recycleMoney").toString()));
|
map.put("storagemoney",DoubleUtil.roundTwo(map.get("storageMoney").toString()));
|
String orderId = map.get("orderId").toString();
|
// String[] orderIds = orderId.split(",");
|
map.put("orderNum",orderId);
|
}
|
int count = 0 ;
|
if(storageList.size()==0){
|
if(storageNum>0){
|
storageList = otherUserMapper.queryStorageList1(userModel);
|
for (Map<String,Object> map:storageList) {
|
|
map.put("orderNum",0);
|
}
|
}
|
}else{
|
}
|
|
result.put("storageNum",storageNum);
|
result.put("data", storageList);
|
result.put("count", pageInfo.getTotal());
|
result.put("code", 0);
|
return result;
|
}
|
|
|
public Map<String,Object> queryStorageObjectList(StorageModel storageModel) {
|
// List<String> partnerIds = cityPartnerService.queryPartnerByCurrent();
|
// storageModel.setPartnerIds(partnerIds);
|
if(null!=storageModel.getStartTime()&&!"".equals(storageModel.getStartTime())){
|
storageModel.setStartTime(storageModel.getStartTime()+" 00:00:00");
|
}
|
if(null!=storageModel.getEndTime()&&!"".equals(storageModel.getEndTime())){
|
storageModel.setEndTime(storageModel.getEndTime()+" 23:59:59");
|
}
|
Map<String,Object> result = new HashMap<>();
|
PageHelper.startPage(storageModel.getPage(),storageModel.getLimit());
|
List<Map<String,Object>> list = otherUserMapper.queryStorageObjectList(storageModel);
|
PageInfo<Map<String,Object>> pageInfo=new PageInfo<>(list);
|
for (Map<String,Object> map:list) {
|
map.put("storageweight",DoubleUtil.roundThree(map.get("storageWeight").toString()));
|
map.put("storagemoney",DoubleUtil.roundTwo(map.get("storageMoney").toString()));
|
map.put("recycleweight",DoubleUtil.roundThree(map.get("recycleWeight").toString()));
|
map.put("recyclemoney",DoubleUtil.roundTwo(map.get("recycleMoney").toString()));
|
map.put("receiverphone",map.get("receiverPhone").toString());
|
map.put("storageid",map.get("storageId").toString());
|
map.put("storagetime",map.get("storageTime").toString());
|
}
|
result.put("count",pageInfo.getTotal());
|
result.put("code",0);
|
result.put("data",list);
|
return result;
|
}
|
|
public Map<String, Object> queryQromoterList(PromoterModel promoterModel){
|
List<String> partnerIds = new ArrayList<>();
|
if(null!=promoterModel.getPartnerId()&&!"".equals(promoterModel.getPartnerId())){
|
partnerIds.add(promoterModel.getPartnerId());
|
}else{
|
partnerIds = cityPartnerService.queryPartnerByCurrent();
|
}
|
promoterModel.setPartnerIds(partnerIds);
|
if(!org.apache.commons.lang3.StringUtils.isEmpty(promoterModel.getNickName())){
|
promoterModel.setNickName(new String(org.apache.commons.codec.binary.Base64.encodeBase64(promoterModel.getNickName().getBytes())));
|
}
|
String startTime = promoterModel.getStartTime();
|
String endTime = promoterModel.getEndTime();
|
if(null!=startTime&&!"".equals(startTime)){
|
startTime = startTime+ " 00:00:00";
|
promoterModel.setStartTime(startTime);
|
}
|
if(null!=endTime&&!"".equals(endTime)){
|
endTime = endTime+ " 23:59:59";
|
promoterModel.setEndTime(endTime);
|
}
|
PageHelper.startPage(promoterModel.getPage(),promoterModel.getLimit());
|
|
List<PromoterModel> list = otherUserMapper.queryQromoterLeven(promoterModel);
|
PageInfo<PromoterModel> pageInfo = new PageInfo<>(list);
|
int count = Convert.toInt(pageInfo.getTotal());
|
if(null!=list&&list.size()>0) {
|
for (PromoterModel p : list) {
|
p.setTurnoverRate("0");
|
// 未注册总数
|
if (null != p.getUnregistCount()) {
|
BigDecimal totalNum = new BigDecimal(p.getTotalNum());
|
BigDecimal unregistCount = totalNum.subtract(new BigDecimal(p.getRegistCount()));
|
unregistCount = unregistCount.subtract(new BigDecimal(p.getCount()));
|
p.setUnregistCount(unregistCount.toString());
|
} else {
|
p.setUnregistCount("0");
|
}
|
// 已注册总数
|
if (null != p.getRegistCount()) {
|
p.setRegistCount(String.valueOf(Integer.parseInt(p.getRegistCount()) + Integer.parseInt(p.getCount())));
|
} else {
|
p.setRegistCount("0");
|
}
|
// 已成交总数
|
if (null != p.getCount()) {
|
p.setOrderCount(p.getCount());
|
} else {
|
p.setOrderCount("0");
|
}
|
|
if (null != p.getRegistCount()) {
|
if (null != p.getOrderCount()) {
|
if (p.getOrderCount().equals("0")) {
|
p.setTurnoverRate("0" + "%");
|
} else {
|
BigDecimal turnoverRate = new BigDecimal(p.getOrderCount()).divide(new BigDecimal(p.getRegistCount()), 3, BigDecimal.ROUND_DOWN);
|
p.setTurnoverRate(turnoverRate.multiply(new BigDecimal("100")).toString() + "%");
|
}
|
|
} else {
|
p.setOrderCount("0");
|
p.setTurnoverRate("0" + "%");
|
}
|
|
} else {
|
p.setOrderCount("0");
|
p.setRegistCount("0");
|
}
|
PromoterModel pmx = orderMapper.queryPromoterOrderWeightMoney(p.getUserId(), promoterModel.getStartTime(), promoterModel.getEndTime());
|
if(null!=pmx){
|
if (null != pmx.getOrderWeightCount()) {
|
p.setOrderWeightCount(DoubleUtil.roundThree(pmx.getOrderWeightCount()));
|
} else {
|
p.setOrderWeightCount("0");
|
}
|
|
if (null != pmx.getOrderMoneyCount()) {
|
p.setOrderMoneyCount(DoubleUtil.roundTwo(pmx.getOrderMoneyCount()));
|
} else {
|
p.setOrderMoneyCount("0");
|
}
|
}else{
|
p.setOrderWeightCount("0");
|
p.setOrderMoneyCount("0");
|
|
}
|
|
int allOrderNum = orderMapper.queryAllOrderByUserId(p.getUserId(), promoterModel.getStartTime(), promoterModel.getEndTime());
|
p.setAllOrderNum(allOrderNum);
|
|
}
|
}else{
|
PromoterModel p = new PromoterModel();
|
p.setOrderMoneyCount("0");
|
p.setOrderWeightCount("0");
|
p.setAllOrderNum(0);
|
p.setOrderCount("0");
|
p.setRegistCount("0");
|
p.setTurnoverRate("0"+"%");
|
p.setUnregistCount("0");
|
list.add(p);
|
count=0;
|
}
|
Map<String, Object> m = new HashMap<>();
|
m.put("data", list);
|
m.put("count", count);
|
m.put("code", 0);
|
return m;
|
}
|
|
|
public Map<String, Object> queryQromoterOrder(PromoterModel promoterModel){
|
if(null!=promoterModel.getStartTime()&&!"".equals(promoterModel.getStartTime())){
|
promoterModel.setStartTime(promoterModel.getStartTime()+" 00:00:00");
|
}
|
if(null!=promoterModel.getEndTime()&&!"".equals(promoterModel.getEndTime())){
|
promoterModel.setEndTime(promoterModel.getEndTime()+" 23:59:59");
|
}
|
List<PromoterModel> promoterModels = new ArrayList<>();
|
int count=0;
|
if(null!=promoterModel.getSortType()&&!"".equals(promoterModel.getSortType())){
|
promoterModel.setOrderNumSort(Integer.parseInt(promoterModel.getSortType()));
|
PageHelper.startPage(promoterModel.getPage(),promoterModel.getLimit());
|
promoterModels = orderMapper.queryQromoterOrderOne(promoterModel);
|
PageInfo<PromoterModel> pageInfo=new PageInfo<>(promoterModels);
|
count=Convert.toInt(pageInfo.getTotal());
|
//用于接收重复的项目片块数据,返回给方法的调用者
|
List<List<PromoterModel>> result = new ArrayList<List<PromoterModel>>();
|
//用于临时保存重复的项目片块数据
|
Map<String, List<PromoterModel>> map = new TreeMap<String, List<PromoterModel>>();
|
|
for (PromoterModel model:promoterModels) {
|
PromoterModel newP = new PromoterModel();
|
String userId = model.getCreateUserId();
|
//判断当前值是否已经在map中存在
|
if (map.containsKey(userId)) {
|
List<PromoterModel> hasObj = map.get(userId);
|
//对象拷贝
|
PromoterModel landTarget = new PromoterModel();
|
BeanUtil.copyProperties(model, landTarget);
|
hasObj.add(landTarget);
|
new ArrayList<PromoterModel>().add(landTarget);
|
map.put(userId, hasObj);
|
} else {
|
List<PromoterModel> newObj = new ArrayList<PromoterModel>();
|
PromoterModel landTarget = new PromoterModel();
|
BeanUtil.copyProperties(model, landTarget);
|
newObj.add(landTarget);
|
map.put(userId, newObj);
|
}
|
}
|
//取出所有的重复的数据值,存入到result中
|
for (Map.Entry<String, List<PromoterModel>> entry : map.entrySet()) {
|
result.add(entry.getValue());
|
}
|
promoterModels = getOneOrMore(promoterModel.getOrderNumSort(),result);
|
|
}else{
|
PageHelper.startPage(promoterModel.getPage(),promoterModel.getLimit());
|
promoterModels = orderMapper.queryQromoterOrder(promoterModel);
|
PageInfo<PromoterModel> pageInfo=new PageInfo<>(promoterModels);
|
count=Convert.toInt(pageInfo.getTotal());
|
}
|
|
for (PromoterModel model:promoterModels) {
|
String orderWeightCount = model.getOrderWeightCount();
|
model.setOrderWeightCount(DoubleUtil.roundThree(orderWeightCount));
|
model.setOrderMoneyCount(DoubleUtil.roundTwo(model.getOrderMoneyCount()));
|
String nickName= model.getNickName();
|
if(null!=nickName&&!"".equals(nickName)){
|
nickName = cn.hutool.core.codec.Base64.decodeStr(model.getNickName());
|
|
model.setNickName(nickName);
|
}
|
}
|
if(null!=promoterModel.getSortType()&&!"".equals(promoterModel.getSortType())){
|
count = promoterModels.size();
|
}
|
|
Map<String, Object> m = new HashMap<>();
|
m.put("data", promoterModels);
|
m.put("count", count);
|
m.put("code", 0);
|
return m;
|
|
}
|
|
private List<PromoterModel> getOneOrMore(int sort,List<List<PromoterModel>> result){
|
List<PromoterModel> oneOrMore = new ArrayList<>();
|
for (List<PromoterModel> m1List:result) {
|
if(m1List.size()>0){
|
switch (sort) {
|
case 1:oneOrMore.add(m1List.get(0)); break;
|
case 2:if(m1List.size()>1){ oneOrMore.add(m1List.get(1));} break;
|
case 3:if(m1List.size()>2){oneOrMore.add(m1List.get(2));} break;
|
case 4:if(m1List.size()>3){oneOrMore.add(m1List.get(3));} break;
|
default:
|
break;
|
}
|
}
|
}
|
return oneOrMore;
|
}
|
|
|
public Map<String, Object> queryCollectorList(PromoterModel promoterModel){
|
|
List<String> partnerIds = new ArrayList<>();
|
if(null!=promoterModel.getPartnerId()&&!"".equals(promoterModel.getPartnerId())){
|
partnerIds.add(promoterModel.getPartnerId());
|
}else{
|
partnerIds = cityPartnerService.queryPartnerByCurrent();
|
}
|
promoterModel.setPartnerIds(partnerIds);
|
|
Map<String, Object> result = new HashMap<>();
|
//查询回收员总数
|
List<String> collectorNum = otherUserMapper.queryCollectorNum(partnerIds);
|
if(collectorNum.size()==0){
|
result.put("collectorNum",collectorNum.size());
|
result.put("storageWeight","0");
|
result.put("weightError","0");
|
result.put("storageMoney","0");
|
result.put("moneyError","0");
|
result.put("data",new ArrayList<UserModel>());
|
result.put("count", 0);
|
result.put("code", 0);
|
return result;
|
}
|
Map<String,Object> totalWeightAndMoney =orderStorageInfoMapper.totalWeightAndMoney(null,partnerIds);
|
String paramName = promoterModel.getParamName();
|
if(null!=paramName&&!"".equals(paramName)){
|
if(com.xzx.gc.util.DateUtil.isBase64(paramName)){
|
promoterModel.setNickName(new String(Base64.encodeBase64(paramName.getBytes())));
|
} else{
|
promoterModel.setMobilePhone(paramName);
|
promoterModel.setName(paramName);
|
}
|
}
|
String startTime = promoterModel.getStartTime();
|
String endTime = promoterModel.getEndTime();
|
if(null!=startTime&&!"".equals(startTime)){
|
startTime = startTime+" 00:00:00";
|
}
|
if(null!=endTime&&!"".equals(endTime)){
|
endTime = endTime+" 23:59:59";
|
}
|
promoterModel.setStartTime(startTime);
|
promoterModel.setEndTime(endTime);
|
PageHelper.startPage(promoterModel.getPage(),promoterModel.getLimit());
|
|
List<UserModel> map = otherUserMapper.queryCollectorPageList(promoterModel);
|
PageInfo<UserModel> pageInfo=new PageInfo<>(map);
|
int count = Convert.toInt(pageInfo.getTotal());
|
for (UserModel model:map) {
|
BigDecimal storageWeight = new BigDecimal(model.getStorageWeight()).divide(new BigDecimal("1000"),3, BigDecimal.ROUND_CEILING);
|
BigDecimal recycleWeight = new BigDecimal(model.getRecycleWeight()).divide(new BigDecimal("1000"),3, BigDecimal.ROUND_CEILING);
|
BigDecimal weightError = new BigDecimal(model.getWeightError()).divide(new BigDecimal("1000"),3, BigDecimal.ROUND_CEILING);
|
|
BigDecimal storageMoney = new BigDecimal(model.getStorageMoney()).divide(new BigDecimal("10000"),2, BigDecimal.ROUND_CEILING);
|
BigDecimal recycleMoney = new BigDecimal(model.getRecycleMoney()).divide(new BigDecimal("10000"),2, BigDecimal.ROUND_CEILING);
|
BigDecimal moneyError = new BigDecimal(model.getMoneyError()).divide(new BigDecimal("10000"),2, BigDecimal.ROUND_CEILING);
|
|
model.setStorageWeight(DoubleUtil.roundSix(storageWeight.toString()));
|
model.setStorageMoney(DoubleUtil.roundFive(storageMoney.toString()));
|
model.setRecycleWeight(DoubleUtil.roundSix(recycleWeight.toString()));
|
model.setRecycleMoney(DoubleUtil.roundFive(recycleMoney.toString()));
|
model.setWeightError(DoubleUtil.roundSix(weightError.toString()));
|
model.setMoneyError(DoubleUtil.roundFive(moneyError.toString()));
|
|
int orderNum=0;
|
List<String> orderIds = orderMapper.queryUserOrderNum(model.getUserId(),partnerIds,startTime,endTime);
|
model.setOrderNum(orderIds.size());
|
}
|
//累计重量误差
|
BigDecimal weightError = new BigDecimal(totalWeightAndMoney.get("storageWeight").toString()).subtract(new BigDecimal(totalWeightAndMoney.get("recycleWeight").toString()));
|
weightError = weightError.divide(new BigDecimal("1000"),3);
|
//累计金额误差
|
BigDecimal moneyError = new BigDecimal(totalWeightAndMoney.get("storageMoney").toString()).subtract(new BigDecimal(totalWeightAndMoney.get("recycleMoney").toString()));
|
moneyError = moneyError.divide(new BigDecimal("10000"),5);
|
|
BigDecimal totalWeight = new BigDecimal(totalWeightAndMoney.get("storageWeight").toString()).divide(new BigDecimal("1000"));
|
BigDecimal totalMoney = new BigDecimal(totalWeightAndMoney.get("storageMoney").toString()).divide(new BigDecimal("10000"));
|
|
result.put("collectorNum",collectorNum.size());
|
result.put("storageWeight",DoubleUtil.roundSix(totalWeight.toString()));
|
result.put("weightError",DoubleUtil.roundSix(weightError.toString()));
|
result.put("storageMoney",DoubleUtil.roundFive(totalMoney.toString()));
|
result.put("moneyError",DoubleUtil.roundFive(moneyError.toString()));
|
result.put("data", map);
|
result.put("count", count);
|
result.put("code", 0);
|
return result;
|
}
|
|
public void updateById(OtherUserInfo otherUserInfo){
|
otherUserMapper.updateByPrimaryKeySelective(otherUserInfo);
|
}
|
|
public void deleteById(String userId){
|
OtherUserInfo otherUserInfo=new OtherUserInfo();
|
otherUserInfo.setUserId(userId);
|
otherUserInfo.setDelFlag(Constants.DEL_FLAG);
|
updateById(otherUserInfo);
|
}
|
|
public Map<String, Object> queryCityPartnerForOtherUser(UserModel model) {
|
//List<String> partnerIds = queryPartnerByCurrent();
|
List<String> partnerIds = new ArrayList<>();
|
if(null!=model.getPartnerId()&&!"".equals(model.getPartnerId())){
|
partnerIds.add(model.getPartnerId());
|
}else{
|
partnerIds = cityPartnerService.queryPartnerByCurrent();
|
}
|
List<UserModel> list1 = otherUserMapper.queryCityPartnerForOtherUser(partnerIds, "2");
|
List<UserModel> list2 = otherUserMapper.queryCityPartnerForOtherUser(partnerIds, "6");
|
Map<String, Object> map = new HashMap<>();
|
map.put("code", 0);
|
map.put("hsyData", list1);
|
map.put("tgyData", list2);
|
return map;
|
}
|
|
/**
|
* 查找最近的骑手
|
* @param lon
|
* @param lat
|
* @return
|
*/
|
public OtherUserInfo findNearestByLocationAndPartnerId(String partnerId,String lon, String lat){
|
return otherUserMapper.findNearestByLocationAndPartnerId(partnerId,lon,lat);
|
}
|
|
public OtherUserInfo findNearestByLocationAndFenceId(String fenceId,String lon, String lat){
|
return otherUserMapper.findNearestByLocationAndFenceId(fenceId,lon,lat);
|
}
|
|
|
|
|
/**
|
* 首页智能推荐
|
* 规则:推荐一位最近的集货员和一位废纸报价最高的骑手。当集货员不存在则替换为最近的骑手
|
* @return
|
*/
|
public List<UserRecommendDTO> recommend(UserRecommendParamDTO userRecommendParamDTO) {
|
List<UserRecommendDTO> list=new ArrayList<>();
|
//1:混合推荐回收员和集货员 2:推荐回收员
|
int type = userRecommendParamDTO.getType();
|
|
if(type==1) {
|
//最近500m的集货员
|
UserGatherInfo nearestByLocation = userGatherInfoService.findNearestByLocation(userRecommendParamDTO.getLongitude(), userRecommendParamDTO.getLatitude());
|
if (nearestByLocation != null) {
|
UserRecommendDTO userRecommendDTO = new UserRecommendDTO();
|
BeanUtil.copyProperties(nearestByLocation, userRecommendDTO);
|
userRecommendDTO.setType(UserEnum.集货员类型.getValue());
|
userRecommendDTO.setRecommendType(UserEnum.距离最近集货推荐.getValue());
|
OtherUserInfo otherUserInfo=new OtherUserInfo();
|
otherUserInfo.setUserId(nearestByLocation.getUserId());
|
otherUserInfo.setLatitude(userRecommendParamDTO.getLatitude());
|
otherUserInfo.setLongitude(userRecommendParamDTO.getLongitude());
|
userRecommendDTO.setOtherUserInfo(otherUserInfo);
|
list.add(userRecommendDTO);
|
}
|
}
|
|
RecommendParamDTO recommendParamDTO=new RecommendParamDTO();
|
BeanUtil.copyProperties(userRecommendParamDTO,recommendParamDTO);
|
|
if(CollUtil.isEmpty(list)) {
|
//距离最近
|
recommendParamDTO.setRecommendType(UserEnum.距离最近骑手推荐.getValue());
|
OtherUserInfo otherUserInfo = recommendUser(recommendParamDTO);
|
if (otherUserInfo != null) {
|
UserRecommendDTO userRecommendDTO = new UserRecommendDTO();
|
BeanUtil.copyProperties(otherUserInfo, userRecommendDTO);
|
userRecommendDTO.setType(UserEnum.回收员类型.getValue());
|
userRecommendDTO.setRecommendType(UserEnum.距离最近骑手推荐.getValue());
|
userRecommendDTO.setOtherUserInfo(otherUserInfo);
|
list.add(userRecommendDTO);
|
}
|
}
|
|
//报价最高
|
recommendParamDTO.setRecommendType(UserEnum.报价最高骑手推荐.getValue());
|
OtherUserInfo otherUserInfo = recommendUser(recommendParamDTO);
|
if(otherUserInfo==null){
|
recommendParamDTO.setRecommendType(UserEnum.随机选取骑手推荐.getValue());
|
otherUserInfo = recommendUser(recommendParamDTO);
|
if(otherUserInfo!=null){
|
UserRecommendDTO userRecommendDTO = new UserRecommendDTO();
|
BeanUtil.copyProperties(otherUserInfo, userRecommendDTO);
|
userRecommendDTO.setType(UserEnum.回收员类型.getValue());
|
userRecommendDTO.setRecommendType(UserEnum.随机选取骑手推荐.getValue());
|
userRecommendDTO.setOtherUserInfo(otherUserInfo);
|
list.add(userRecommendDTO);
|
}
|
}else {
|
UserRecommendDTO userRecommendDTO = new UserRecommendDTO();
|
BeanUtil.copyProperties(otherUserInfo, userRecommendDTO);
|
userRecommendDTO.setType(UserEnum.回收员类型.getValue());
|
userRecommendDTO.setRecommendType(UserEnum.报价最高骑手推荐.getValue());
|
userRecommendDTO.setOtherUserInfo(otherUserInfo);
|
list.add(userRecommendDTO);
|
}
|
|
|
if(CollUtil.isNotEmpty(list)){
|
|
Long addressId = userRecommendParamDTO.getAddressId();
|
String createUserId=null;
|
if(addressId!=null){
|
createUserId=addressService.findById(addressId).getUserId();
|
}
|
|
if(type==2){
|
list=list.stream().sorted(Comparator.comparingInt(x->Convert.toInt(x.getRecommendType()))).collect(Collectors.toList());
|
list=CollUtil.newArrayList(list.get(0));
|
}
|
|
for (UserRecommendDTO dto : list) {
|
//额外的信息
|
UserRecommendListResDTO resDTO = getHeadInfo(dto.getOtherUserInfo(), userRecommendParamDTO.getLongitude(), userRecommendParamDTO.getLatitude(), createUserId, dto.getSysEnvironmentalInfo());
|
dto.setUserInfo(resDTO);
|
}
|
|
//首页推荐至少显示2条记录
|
if(type==1&&list.size()==1) {
|
UserRecommendDTO dto = ObjectUtil.cloneByStream(list.get(0));
|
list.add(dto);
|
}
|
}
|
return list;
|
|
}
|
|
/**
|
* 获取回收员头部信息
|
* @param otherUserInfo
|
* @param createUserId 创建用户即普通用户
|
* @return
|
*/
|
public UserRecommendListResDTO getHeadInfo(OtherUserInfo otherUserInfo, String longitude, String latitude,String createUserId,SysEnvironmentalInfo sysEnvironmentalInfo){
|
|
Long itemId = otherUserInfo.getItemId();
|
String userId = otherUserInfo.getUserId();
|
UserRecommendListResDTO resDTO=new UserRecommendListResDTO();
|
BeanUtil.copyProperties(otherUserInfo,resDTO);
|
resDTO.setType(UserEnum.回收员类型.getValue());
|
if(StrUtil.isNotBlank(latitude)&&StrUtil.isNotBlank(longitude)) {
|
//单位米
|
double distance = LocationUtils.getDistance(Convert.toDouble(otherUserInfo.getLatitude(), Convert.toDouble(0)), Convert.toDouble(otherUserInfo.getLongitude(), Convert.toDouble(0)), Convert.toDouble(latitude), Convert.toDouble(longitude));
|
//距离
|
resDTO.setDistance(businessUtil.changeWeight(Convert.toStr(NumberUtil.div(distance,1000))));
|
}
|
//服务次数
|
List<OrderInfo> serviceOrderList = orderService.findServiceOrderByUserIdAndStatus(userId, CollUtil.newArrayList(OrderEnum.待入库.getValue(),OrderEnum.完成.getValue(),OrderEnum.入库中.getValue()));
|
resDTO.setServiceNum(serviceOrderList.size());
|
//自己报价
|
if(itemId!=null){
|
Example example = new Example(SysItemPrice.class);
|
Example.Criteria criteria = example.createCriteria();
|
criteria.andEqualTo("itemId", itemId);
|
criteria.andEqualTo("delFlag", Constants.DEL_NOT_FLAG);
|
example.setOrderByClause("price desc");
|
List<SysItemPrice> sysItemPrices = sysItemPriceMapper.selectByExample(example);
|
if (CollUtil.isNotEmpty(sysItemPrices)) {
|
BigDecimal price = CollUtil.getFirst(sysItemPrices).getPrice();
|
resDTO.setSelfMoney(businessUtil.changeMoney(price));
|
}
|
}
|
//平台报价
|
if(sysEnvironmentalInfo!=null){
|
resDTO.setPlatMoney(businessUtil.changeMoney(sysEnvironmentalInfo.getPrice()));
|
}
|
|
//预计时间 服务中多一个用户多1小时
|
int fwzNum = orderService.findListOrderReceiveTime(userId,createUserId);
|
DateTime dateTime;
|
String hour = DateUtil.format(new Date(), DateUtils.DATE_FORMAT_H);
|
//超过下午6点从明天上午8点开始预约
|
if(Convert.toInt(hour)>=18){
|
String format = DateUtil.format(DateUtil.offsetDay(new Date(), 1), DateUtils.DATE_FORMAT_YMD);
|
format=format+" 08:00:00";
|
dateTime = DateUtil.offsetHour(DateUtil.parse(format), fwzNum);
|
}else{
|
fwzNum=fwzNum==0?1:fwzNum;
|
dateTime = DateUtil.offsetHour(new Date(), fwzNum);
|
}
|
resDTO.setScheduledTime(DateUtil.format(dateTime,DateUtils.DATE_FORMAT_HM));
|
//排队人数
|
resDTO.setQueueNum(fwzNum);
|
//是否服务过
|
if(StrUtil.isNotBlank(createUserId)) {
|
long num = serviceOrderList.stream().filter(x->x.getCreateUserId().equals(createUserId)).count();
|
if(num>0){
|
resDTO.setServiceFlag(true);
|
}
|
}
|
//是否高于平台
|
if(Convert.toBigDecimal(resDTO.getSelfMoney(),Constants.MONEY_INIT).compareTo(Convert.toBigDecimal(resDTO.getPlatMoney(),Constants.MONEY_INIT))>0){
|
resDTO.setHighThanPlatFlag(true);
|
}
|
|
//平均取货时间(分钟)=(所有单完成时间-接单时间)/单数
|
long perMinuteOrder=0;
|
for (OrderInfo orderInfo : serviceOrderList) {
|
String completeTime = orderInfo.getCompleteTime();
|
String receiveTime = orderInfo.getReceiveTime();
|
if(StrUtil.isNotBlank(completeTime)&&StrUtil.isNotBlank(receiveTime)){
|
perMinuteOrder += DateUtil.between(DateUtil.parseDateTime(receiveTime), DateUtil.parseDateTime(completeTime), DateUnit.MINUTE);
|
}
|
}
|
if(CollUtil.isNotEmpty(serviceOrderList)) {
|
resDTO.setPerMinuteOrder(perMinuteOrder / serviceOrderList.size());
|
}else {
|
resDTO.setPerMinuteOrder(0);
|
}
|
|
//满意度
|
Example example=new Example(OrderAppraiseInfo.class);
|
Example.Criteria criteria = example.createCriteria();
|
criteria.andEqualTo("delFlag",Convert.toShort(Constants.DEL_NOT_FLAG));
|
criteria.andEqualTo("receiverId",otherUserInfo.getUserId());
|
List<OrderAppraiseInfo> orderAppraiseInfos = orderAppraiseInfoMapper.selectByExample(example);
|
if(CollUtil.isNotEmpty(orderAppraiseInfos)) {
|
double sum = orderAppraiseInfos.stream().mapToDouble(x -> Convert.toDouble(x.getStar(),Convert.toDouble(Constants.SCORE_MAX))).sum();
|
resDTO.setSatisfaction(Convert.toInt(sum/(orderAppraiseInfos.size()*Constants.SCORE_MAX)*100));
|
}
|
|
return resDTO;
|
}
|
|
|
/**
|
* 推荐骑手按 1报价最高 2:地址最近 3随机选取
|
*/
|
public OtherUserInfo recommendUser(RecommendParamDTO recommendParamDTO){
|
OtherUserInfo tempUser = null;
|
Long addressId = recommendParamDTO.getAddressId();
|
String recommendType = recommendParamDTO.getRecommendType();
|
FenceDto fenceDto = partnerGaodeService.findPartnerIdAndTownByLon(recommendParamDTO.getLongitude(),recommendParamDTO.getLatitude(),addressId);
|
String fenceId=fenceDto.getFenceId();
|
if(StrUtil.isNotBlank(fenceId)){
|
String partnerId=fenceDto.getPartnerId();
|
|
//指定要排除指定骑手的合伙人
|
String configValue = configService.findByCode(SysConfigConstant.EXCLUDE_OTHER_PARTNER).getConfigValue();
|
if(StrUtil.isNotBlank(configValue)){
|
List<String> partnerIdlist = Arrays.asList(configValue.split(","));
|
if(partnerIdlist.contains(partnerId)){
|
return tempUser;
|
}
|
}
|
String townShipId=fenceDto.getTownId();
|
|
//平台废纸报价
|
SysEnvironmentalInfo sysEnvironmentalInfo = sysEnvironmentalInfoService.findByItemTypeAndAreaNotDel(Constants.PAPER_WASTE_ITEM_TYPE, Convert.toInt(townShipId));
|
if(UserEnum.报价最高骑手推荐.getValue().equals(recommendType)) {
|
List<OtherUserInfo> otherUserInfoList;
|
//废纸报价了的
|
otherUserInfoList = otherUserMapper.findOfferByFenceId(fenceId, Constants.PAPER_WASTE_ITEM_TYPE);
|
if (CollUtil.isEmpty(otherUserInfoList)) {
|
otherUserInfoList = otherUserMapper.findOfferByPartnerId(partnerId, Constants.PAPER_WASTE_ITEM_TYPE);
|
}
|
if (sysEnvironmentalInfo != null) {
|
//找出报价最高的
|
BigDecimal temp = Convert.toBigDecimal(sysEnvironmentalInfo.getPrice());
|
for (OtherUserInfo otherUserInfo : otherUserInfoList) {
|
Long itemId = otherUserInfo.getItemId();
|
|
Example example = new Example(SysItemPrice.class);
|
Example.Criteria criteria = example.createCriteria();
|
criteria.andEqualTo("itemId", itemId);
|
criteria.andEqualTo("delFlag", Constants.DEL_NOT_FLAG);
|
example.setOrderByClause("price desc");
|
List<SysItemPrice> sysItemPrices = sysItemPriceMapper.selectByExample(example);
|
if (CollUtil.isNotEmpty(sysItemPrices)) {
|
BigDecimal price = CollUtil.getFirst(sysItemPrices).getPrice();
|
if (price.compareTo(temp) > 0) {
|
temp = price;
|
tempUser = otherUserInfo;
|
}
|
}
|
}
|
|
}
|
}else if(UserEnum.距离最近骑手推荐.getValue().equals(recommendType)){
|
//查找最近的骑手
|
OtherUserInfo nearestByLocation1;
|
nearestByLocation1 = findNearestByLocationAndFenceId(fenceId, recommendParamDTO.getLongitude(), recommendParamDTO.getLatitude());
|
if (nearestByLocation1 == null) {
|
nearestByLocation1 = findNearestByLocationAndPartnerId(partnerId, recommendParamDTO.getLongitude(), recommendParamDTO.getLatitude());
|
}
|
tempUser= nearestByLocation1;
|
}else if(UserEnum.随机选取骑手推荐.getValue().equals(recommendType)){
|
List<OtherUserInfo> byUserTypeAndPartner;
|
byUserTypeAndPartner = findByUserTypeAndFenceIdForNotLeave( fenceId);
|
if(CollUtil.isEmpty(byUserTypeAndPartner)){
|
byUserTypeAndPartner = findByUserTypeAndPartnerIdForNotLeave( partnerId);
|
}
|
|
if(CollUtil.isNotEmpty(byUserTypeAndPartner)){
|
OtherUserInfo otherUserInfo = RandomUtil.randomEle(byUserTypeAndPartner);
|
tempUser=otherUserInfo;
|
}
|
}
|
|
//设置平台报价信息
|
if(tempUser!=null){
|
tempUser.setSysEnvironmentalInfo(sysEnvironmentalInfo);
|
//围栏ID
|
tempUser.setOrderFenceId(fenceId);
|
}
|
|
}
|
return tempUser;
|
}
|
|
|
/**
|
* 全部推荐
|
* @param paramDTO
|
* @return
|
*/
|
public List<UserRecommendListResDTO> recommendList(UserRecommendListParamDTO paramDTO) {
|
List<UserRecommendListResDTO> list=new ArrayList<>();
|
FenceDto fenceDto = partnerGaodeService.findPartnerIdAndTownByLon(paramDTO.getLongitude(),paramDTO.getLatitude(),paramDTO.getAddressId());
|
String fenceId = fenceDto.getFenceId();
|
if(StrUtil.isNotBlank(fenceId)){
|
|
String partnerId=fenceDto.getPartnerId();
|
//指定要排除指定骑手的合伙人
|
String configValue = configService.findByCode(SysConfigConstant.EXCLUDE_OTHER_PARTNER).getConfigValue();
|
if(StrUtil.isNotBlank(configValue)){
|
List<String> partnerIdlist = Arrays.asList(configValue.split(","));
|
if(partnerIdlist.contains(partnerId)){
|
return list;
|
}
|
}
|
|
String townShipId=fenceDto.getTownId();
|
//平台废纸报价
|
SysEnvironmentalInfo sysEnvironmentalInfo = sysEnvironmentalInfoService.findByItemTypeAndAreaNotDel(Constants.PAPER_WASTE_ITEM_TYPE, Convert.toInt(townShipId));
|
|
List<OtherUserInfo> otherUserInfoList;
|
otherUserInfoList = otherUserMapper.findAllOfferByFenceId(fenceId, Constants.PAPER_WASTE_ITEM_TYPE);
|
if(CollUtil.isEmpty(otherUserInfoList)){
|
otherUserInfoList = otherUserMapper.findAllOfferByPartnerId(partnerId, Constants.PAPER_WASTE_ITEM_TYPE);
|
}
|
|
for (OtherUserInfo otherUserInfo : otherUserInfoList) {
|
otherUserInfo.setOrderFenceId(fenceId);
|
UserRecommendListResDTO resDTO = getHeadInfo(otherUserInfo, paramDTO.getLongitude(), paramDTO.getLatitude(), paramDTO.getUserId(),sysEnvironmentalInfo);
|
list.add(resDTO);
|
}
|
|
|
|
//排序
|
if(CollUtil.isNotEmpty(list)) {
|
String filterType = paramDTO.getFilterType();
|
String filterOrder = paramDTO.getFilterOrder();
|
//服务次数
|
if("1".equals(filterType)){
|
//升序
|
if("1".equals(filterOrder)){
|
list=list.stream().sorted(Comparator.comparingInt(UserRecommendListResDTO::getServiceNum)).collect(Collectors.toList());
|
}else{
|
list=list.stream().sorted(Comparator.comparingInt(UserRecommendListResDTO::getServiceNum).reversed()).collect(Collectors.toList());
|
}
|
}else if("2".equals(filterType)){
|
//距离
|
//升序
|
if("1".equals(filterOrder)){
|
CollUtil.sort(list, (o1, o2) -> {
|
if(Convert.toBigDecimal(o1.getDistance()).compareTo(Convert.toBigDecimal(o2.getDistance()))>0){
|
return -1;
|
}else if(Convert.toBigDecimal(o1.getDistance()).compareTo(Convert.toBigDecimal(o2.getDistance()))==0){
|
return 0;
|
}else {
|
return 1;
|
}
|
});
|
}else{
|
CollUtil.sort(list, (o1, o2) -> {
|
if(Convert.toBigDecimal(o1.getDistance()).compareTo(Convert.toBigDecimal(o2.getDistance()))>0){
|
return 1;
|
}else if(Convert.toBigDecimal(o1.getDistance()).compareTo(Convert.toBigDecimal(o2.getDistance()))==0){
|
return 0;
|
}else {
|
return -1;
|
}
|
});
|
}
|
}else if("3".equals(filterType)){
|
//价格
|
//升序
|
if("1".equals(filterOrder)){
|
CollUtil.sort(list, (o1, o2) -> {
|
if(Convert.toBigDecimal(o1.getSelfMoney(),Constants.MONEY_INIT).compareTo(Convert.toBigDecimal(o2.getSelfMoney(),Constants.MONEY_INIT))>0){
|
return -1;
|
}else if(Convert.toBigDecimal(o1.getSelfMoney(),Constants.MONEY_INIT).compareTo(Convert.toBigDecimal(o2.getSelfMoney(),Constants.MONEY_INIT))==0){
|
return 0;
|
}else {
|
return 1;
|
}
|
});
|
}else{
|
CollUtil.sort(list, (o1, o2) -> {
|
if(Convert.toBigDecimal(o1.getSelfMoney(),Constants.MONEY_INIT).compareTo(Convert.toBigDecimal(o2.getSelfMoney(),Constants.MONEY_INIT))>0){
|
return 1;
|
}else if(Convert.toBigDecimal(o1.getSelfMoney(),Constants.MONEY_INIT).compareTo(Convert.toBigDecimal(o2.getSelfMoney(),Constants.MONEY_INIT))==0){
|
return 0;
|
}else {
|
return -1;
|
}
|
});
|
}
|
}
|
}
|
}
|
return list;
|
}
|
|
public OtherUserInfo findByOrderId(OtherUserLocationParamDTO otherUserLocationParamDTO) {
|
|
String orderId = otherUserLocationParamDTO.getOrderId();
|
|
OrderInfo byId = orderService.findById(orderId);
|
|
String orderType = byId.getOrderType();
|
|
String receiver = byId.getReceiver();
|
|
if(!OrderEnum.集货.getValue().equals(orderType)&&StrUtil.isNotBlank(receiver)){
|
return findById(receiver);
|
}
|
|
return null;
|
}
|
}
|