| 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; | 
|     } | 
| } |