Pu Zhibing
8 天以前 ed02b20b31e013159c55ab14b81772e41b36649c
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -1,24 +1,35 @@
package com.stylefeng.guns.modular.system.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.core.common.constant.JwtConstants;
import com.stylefeng.guns.core.shiro.ShiroKit;
import com.stylefeng.guns.core.shiro.ShiroUser;
import com.stylefeng.guns.core.util.JwtTokenUtil;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper;
import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService;
import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper;
import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
import com.stylefeng.guns.modular.system.dao.*;
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.model.vo.*;
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.*;
import com.stylefeng.guns.modular.system.util.qianyuntong.SMSUtil;
import com.stylefeng.guns.modular.system.util.qianyuntong.UserUtil;
import com.stylefeng.guns.modular.system.util.qianyuntong.model.QYTUserInfo;
import com.stylefeng.guns.modular.system.util.qianyuntong.model.SendSmsRequest;
import com.stylefeng.guns.modular.system.warpper.ActivityWarpper;
import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
import com.stylefeng.guns.modular.system.warpper.LoginWarpper;
import com.stylefeng.guns.modular.system.warpper.RegisteredWarpper;
import com.stylefeng.guns.modular.taxi.dao.OrderTaxiMapper;
import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
import io.rong.models.response.TokenResult;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
@@ -26,13 +37,16 @@
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Service
@@ -41,8 +55,6 @@
    @Resource
    private DriverMapper driverMapper;
    @Resource
    private CompanyCityMapper companyCityMapper;
    @Resource
    private UserActivityInviteMapper userActivityInviteMapper;
@@ -61,46 +73,45 @@
    @Resource
    private CompanyMapper companyMapper;
    @Resource
    private DriverActivityRegisteredMapper driverActivityRegisteredMapper;
    @Resource
    private DriverActivityOrderMapper driverActivityOrderMapper;
    @Resource
    private DriverActivityOnlineMapper driverActivityOnlineMapper;
    @Resource
    private DriverActivityHistoryMapper driverActivityHistoryMapper;
    @Resource
    private UserCouponRecordMapper userCouponRecordMapper;
    @Resource
    private DriverOrdersMapper driverOrdersMapper;
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private ALiSendSms aLiSendSms;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private ICompanyCityService companyCityService;
    @Autowired
    private IOpenCityService openCityService;
    @Autowired
    private GDFalconUtil gdFalconUtil;
    @Autowired
    private IOrderService orderService;
    @Autowired
    private ISmsrecordService smsrecordService;
    @Autowired
    private ICarService carService;
    @Autowired
    private IReassignService reassignService;
@@ -120,9 +131,6 @@
    private CarServiceMapper carServiceMapper;
    @Autowired
    private PushUtil pushUtil;
    @Autowired
    private IOrderLogisticsService orderLogisticsService;
    @Value("${pushMinistryOfTransport}")
@@ -130,8 +138,52 @@
    private String salt = "SA;d5#";
    @Resource
    private OrderPrivateCarMapper orderPrivateCarMapper;
    @Resource
    private OrderCrossCityMapper orderCrossCityMapper;
    @Resource
    private OrderTaxiMapper orderTaxiMapper;
    @Autowired
    private GeodesyUtil geodesyUtil;
    @Override
    public List<Driver> queryIdleDriver(Integer type, Double lon, Double lat, Double distance, Integer companyId) throws Exception {
        List<Driver> drivers = driverMapper.queryIdleDriver(type, companyId);
        List<Driver> list = new ArrayList<>();
        for(Driver driver : drivers){
            String value = (String) redisTemplate.opsForValue().get("DRIVER" + String.valueOf(driver.getId()));
            if(null != value){
                Map<String, Double> distance1 = geodesyUtil.getDistance(lon + "," + lat, value);
                double d = Double.valueOf(distance1.get("WGS84")).doubleValue();
                if(d < (distance * 1000)){
                    list.add(driver);
                }
            }
        }
        return list;
    }
    @Override
    public List<Driver> queryIdleDriver(Integer type, Integer serverCarModelId, Double lon, Double lat, Double distance, Integer companyId) throws Exception {
        List<Driver> drivers = driverMapper.queryIdleDriver_(type, serverCarModelId, companyId);
        List<Driver> list = new ArrayList<>();
        for(Driver driver : drivers){
            String value = (String) redisTemplate.opsForValue().get("DRIVER" + String.valueOf(driver.getId()));
            if(null != value){
                Map<String, Double> distance1 = geodesyUtil.getDistance(lon + "," + lat, value);
                double d = Double.valueOf(distance1.get("WGS84")).doubleValue();
                if(d < (distance * 1000)){
                    list.add(driver);
                }
            }
        }
        return list;
    }
    /**
     * 获取短信验证码
@@ -143,36 +195,44 @@
    public ResultUtil queryCaptcha(String phone, Integer type) throws Exception {
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < 4; i++){
        for (int i = 0; i < 4; i++) {
            sb.append((int) (random.nextDouble() * 10));
        }
        String authCode = sb.toString();
        String sms = "短信验证码【" + authCode + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!";
        //发送验证码短信
        redisUtil.setStrValue(phone, authCode, 5 * 60);//设置五分钟过期
        String templateCode = "";
        switch (type){
            case 1:
                templateCode = "SMS_154775435";//身份验证
                break;
            case 2:
                templateCode = "SMS_154775434";//登录确认
                break;
            case 3:
                templateCode = "SMS_154775432";//用户注册
                break;
            case 4:
                templateCode = "SMS_154775431";//修改密码
                break;
        }
        String sData = aLiSendSms.sendSms(phone, "SMS_229715276", "{\"code\":\"" + authCode + "\"}");
        JSONObject jsonObject = JSON.parseObject(sData);
        String message = jsonObject.getString("Message");
        if(!"OK".equals(message)){
            return ResultUtil.error("");
        }
        System.out.println(sms);
//        //发送验证码短信
//        redisTemplate.opsForValue().set(phone, authCode, 5, TimeUnit.MINUTES);//设置五分钟过期
//        String templateCode = "";
//        switch (type) {
//            case 1:
//                templateCode = "SMS_154775435";//身份验证
//                break;
//            case 2:
//                templateCode = "SMS_154775434";//登录确认
//                break;
//            case 3:
//                templateCode = "SMS_154775432";//用户注册
//                break;
//            case 4:
//                templateCode = "SMS_154775431";//修改密码
//                break;
//        }
//        String sData = aLiSendSms.sendSms(phone, "SMS_229715276", "{\"code\":\"" + authCode + "\"}");
//        JSONObject jsonObject = JSON.parseObject(sData);
//        String message = jsonObject.getString("Message");
//        if(!"OK".equals(message)){
//            return ResultUtil.error("");
//        }
//        System.out.println(sms);
        SendSmsRequest request = new SendSmsRequest();
        request.setDestAddress(phone);
        request.setTemplateId("TPL202410290001");
        Map<String, String> templateParams = new HashMap<>();
        templateParams.put("code", authCode);
        request.setTemplateParams(templateParams);
        request.setCode("code");
        request.setSpId("T8d5hdfg");
        SMSUtil.sendSms(request);
        redisTemplate.opsForValue().set(phone, authCode, 5, TimeUnit.MINUTES);//设置五分钟过期
        return ResultUtil.success();
    }
@@ -186,7 +246,7 @@
     */
    @Override
    public boolean checkCaptcha(String phone, String code) throws Exception {
        Object value = redisUtil.getValue(phone);
        Object value = redisTemplate.opsForValue().get(phone);
        if("1234".equals(code)){
            return true;
        }
@@ -332,11 +392,23 @@
    @Override
    public ResultUtil updateDriver(RegisteredWarpper registeredWarpper, Integer uid) throws Exception {
        Driver driver = this.selectById(uid);
        //调用中台接口校验实名信息
        Boolean auth = UserUtil.idCardAuth(registeredWarpper.getName(), registeredWarpper.getIdCard());
        if(!auth){
            return ResultUtil.error("实名认证失败,请输入正确的姓名和身份证号码");
        }
        driver.setName(registeredWarpper.getName());
        driver.setSex(registeredWarpper.getSex());
        driver.setIdCard(registeredWarpper.getIdCard());
        String code = registeredWarpper.getPlaceOfEmployment();
        driver.setArea(registeredWarpper.getArea());
        driver.setAreaCode(registeredWarpper.getAreaCode());
        driver.setCity(registeredWarpper.getCity());
        driver.setCityCode(registeredWarpper.getCityCode());
        driver.setProvince(registeredWarpper.getProvince());
        driver.setProvinceCode(registeredWarpper.getProvinceCode());
        String code = registeredWarpper.getAreaCode();
        Company query = companyCityService.query(code);
        if(null == query){
            return ResultUtil.error("选择从业地暂未开通业务");
@@ -383,7 +455,7 @@
        boolean b = true;
        for(String t : split){
            for(DriverService driverService : list){
                if(driverService.getType() == Integer.valueOf(t)){
                if(driverService.getType().equals(Integer.valueOf(t))){
                    b = false;
                    break;
                }
@@ -434,14 +506,10 @@
     */
    @Override
    public Map<String, Object> queryPhone(String code) throws Exception {
        Company query = companyCityService.query(code);
        Map<String, Object> map = new HashMap<>();
        if(null == query){
            map.put("phone", "");
        }else{
            Phone phone = phoneMapper.queryInfo(query.getId(), 2);
            map.put("phone", null != phone ? phone.getPhone() : "");
        }
        OpenCity openCity = openCityService.openCity1(code);
        Phone phone = phoneMapper.queryInfo(openCity.getId(), 2, 2);
        map.put("phone", null != phone ? phone.getPhone() : "");
        return map;
    }
@@ -456,38 +524,47 @@
    @Override
    public ResultUtil<LoginWarpper> driverLogin(String phone, String password) throws Exception {
        Driver driver = driverMapper.queryByPhone(phone);
        if(null == driver){
        if (null == driver) {
            return ResultUtil.error("账号未注册");
        }
        if(ToolUtil.isNotEmpty(driver.getIdCard()) && driver.getAuthState() == 1){
        Company company = companyMapper.selectById(driver.getCompanyId());
        //查询中台员工数据
//        List<QYTUserInfo> userInfoByPhone = UserUtil.getUserInfoByPhone(driver.getPhone(), company.getEnterCode());
//        if (null == userInfoByPhone || userInfoByPhone.size() == 0) {
//            return ResultUtil.error("账号未注册");
//        }
        if (ToolUtil.isNotEmpty(driver.getIdCard()) && driver.getAuthState() == 1) {
            return ResultUtil.error("账号正在审核中,请耐心等待");
        }
        if(driver.getAuthState() == 3){
        if (driver.getAuthState() == 3) {
            return ResultUtil.error("账号已被冻结,请联系管理员");
        }
        if(!driver.getPassword().equals(ShiroKit.md5(password, salt))){
        if (!driver.getPassword().equals(ShiroKit.md5(password, salt))) {
            return ResultUtil.error("密码错误");
        }
        String value = redisUtil.getValue("DEVICE_" + driver.getId());
        if(ToolUtil.isNotEmpty(value)){
        String value = (String) redisTemplate.opsForValue().get("DEVICE_" + driver.getId());
        if (ToolUtil.isNotEmpty(value)) {
            return ResultUtil.error("当前账户正在车载端登录");
        }
        //调用单点登录逻辑
        this.singlePointLogin(driver.getId());
        String token = this.getToken(driver, password);
        LoginWarpper loginWarpper = new LoginWarpper();
        loginWarpper.setId(driver.getId());
        loginWarpper.setToken(token);
        loginWarpper.setAppid(UUIDUtil.getRandomCode());
        loginWarpper.setState(ToolUtil.isEmpty(driver.getIdCard()) ? 1 : 0);
        TokenResult token1 = RongCloudUtil.getToken(driver.getId().toString(), driver.getName(), driver.getHeadImgUrl());
        loginWarpper.setRongYunToken(token1.getToken());
        //创建高德猎鹰的终端数据
        String tid = gdFalconUtil.createTerminal(phone);
        loginWarpper.setServerId(gdFalconUtil.getServerId());
        loginWarpper.setTerminalId(tid);
//        String tid = gdFalconUtil.createTerminal(phone);
//        loginWarpper.setServerId(gdFalconUtil.getServerId());
//        loginWarpper.setTerminalId(tid);
        return ResultUtil.success(loginWarpper);
    }
@@ -524,7 +601,7 @@
            }else{
                key = requestHeader;
            }
            String value = redisUtil.getValue(key);
            String value = (String) redisTemplate.opsForValue().get(key);
            return null != value ? Integer.valueOf(value) : null;
        }else{
            return null;
@@ -757,18 +834,24 @@
    @Override
    public ResultUtil updatePhone(String phone, String code, Integer uid) throws Exception {
        Driver driver = driverMapper.queryByPhone(phone);
        if(null != driver){
        if (null != driver) {
            return ResultUtil.error("电话号码已被注册");
        }
        boolean b = this.checkCaptcha(phone, code);
        if(!b){
        if (!b) {
            return ResultUtil.error("验证码无效");
        }
        Driver driver1 = this.selectById(uid);
        Company company = companyMapper.selectById(driver1.getCompanyId());
        List<QYTUserInfo> userInfoByPhone = UserUtil.getUserInfoByPhone(driver1.getPhone(), company.getEnterCode());
        if (null == userInfoByPhone || userInfoByPhone.size() == 0) {
            return ResultUtil.error("账号未注册");
        }
        driver1.setAccount(phone);
        driver1.setPhone(phone);
        this.updateById(driver1);
        smsrecordService.saveData(7, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
        return ResultUtil.success();
    }
@@ -813,10 +896,10 @@
        if(driver.getState() == 3){
            return ResultUtil.error("还在服务中,不能更换");
        }
//        boolean idle = carService.idle(carId);
//        if(!idle){
//            return ResultUtil.error("车辆已被绑定了");
//        }
        boolean idle = carService.idle(carId);
        if(!idle){
            return ResultUtil.error("当前车辆已经有其他司机在使用,请更换车辆");
        }
        driver.setCarId(carId);
        this.updateById(driver);
        return ResultUtil.success();
@@ -830,47 +913,31 @@
     * @throws Exception
     */
    @Override
    public Map<String, Object> queryPhone(Integer uid) throws Exception {
    public Map<String, Object> queryPhone(Integer uid, String code) throws Exception {
        Driver driver = this.selectById(uid);
        Company company = companyMapper.selectById(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
                driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
        OpenCity openCity = openCityService.openCity1(code);
        Company company = companyMapper.selectById(driver.getCompanyId());
        Map<String, Object> map = new HashMap<>();
        if(company.getType() == 3){//加盟商
            Phone phone = phoneMapper.queryInfo(company.getId(), 2);
            map.put("branch", "");
            Phone phone = phoneMapper.queryInfo(openCity.getId(), 2, 2);
            map.put("franchisee", null != phone ? phone.getPhone() : "");
            company = companyMapper.selectById(company.getSuperiorId());
            if(null != company){
                phone = phoneMapper.queryInfo(company.getId(), 2);
                map.put("branch", null != phone ? phone.getPhone() : "");
            }else{
                map.put("branch", "");
            }
            company = companyMapper.selectById(company.getSuperiorId());
            if(null != company){
                phone = phoneMapper.queryInfo(company.getId(), 2);
                map.put("platform", null != phone ? phone.getPhone() : "");
            }else{
                map.put("platform", "");
            }
            phone = phoneMapper.queryInfo(openCity.getId(), 2, 1);
            map.put("platform",null != phone ? phone.getPhone() : "");
            return map;
        }
        if(company.getType() == 2){//分公司
            map.put("franchisee", "");
            Phone phone = phoneMapper.queryInfo(company.getId(), 2);
            Phone phone = phoneMapper.queryInfo(openCity.getId(), 2, 2);
            map.put("branch", null != phone ? phone.getPhone() : "");
            company = companyMapper.selectById(company.getSuperiorId());
            if(null != company){
                phone = phoneMapper.queryInfo(company.getId(), 2);
                map.put("platform",null != phone ? phone.getPhone() : "");
            }else{
                map.put("platform", "");
            }
            phone = phoneMapper.queryInfo(openCity.getId(), 2, 1);
            map.put("platform",null != phone ? phone.getPhone() : "");
            return map;
        }
        if(company.getType() == 1){//平台
            map.put("franchisee", "");
            map.put("branch", "");
            Phone phone = phoneMapper.queryInfo(company.getId(), 2);
            Phone phone = phoneMapper.queryInfo(company.getId(), 2, 1);
            map.put("platform", null != phone ? phone.getPhone() : "");
            return map;
        }
@@ -1187,7 +1254,7 @@
            driverOrdersMapper.insert(query);
        }
        DriverWork driverWork = driverWorkMapper.queryNewWork(driver.getId(), 2, 1);
        if(null == driverWork){
        if (null == driverWork) {
            driverWork = new DriverWork();
            driverWork.setStartTime(new Date());
            driverWork.setDriverId(driver.getId());
@@ -1195,22 +1262,22 @@
            driverWork.setType("2");
            driverWorkMapper.insert(driverWork);
        }
        if(driver.getState() == 1){
        if (driver.getState() == 1) {
            driver.setState(2);
            driverMapper.updateById(driver);
        }
        //调用单点登录清除缓存数据
        this.singlePointLogin(driver.getId());
        //封装请求账号密码为shiro可验证的token
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(driver.getPhone(), jobNum.toCharArray());
        String credentials = ShiroKit.md5(driver.getJobNumber(), salt);
        ByteSource credentialsSalt = new Md5Hash(salt);
        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
                new ShiroUser(), credentials, credentialsSalt, "");
        //校验用户账号密码
        HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
        md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
@@ -1218,20 +1285,20 @@
        boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch(
                usernamePasswordToken, simpleAuthenticationInfo);
        String s = JwtTokenUtil.generateToken(String.valueOf(driver.getId()));
        redisUtil.setStrValue(s.substring(s.length() - 32), String.valueOf(driver.getId()), 7 * 24 * 60 * 60);
        redisUtil.setStrValue(driver.getPhone(), s.substring(s.length() - 32));
        redisUtil.setStrValue("DRIVER_" + driver.getId(), s);
        redisTemplate.opsForValue().set(s.substring(s.length() - 32), String.valueOf(driver.getId()), 7, TimeUnit.DAYS);
        redisTemplate.opsForValue().set(driver.getPhone(), s.substring(s.length() - 32));
        redisTemplate.opsForValue().set("DRIVER_" + driver.getId(), s);
        LoginWarpper loginWarpper = new LoginWarpper();
        loginWarpper.setId(driver.getId());
        loginWarpper.setToken(s);
        loginWarpper.setAppid(UUIDUtil.getRandomCode());
        //创建高德猎鹰的终端数据
        String tid = gdFalconUtil.createTerminal(driver.getPhone());
        loginWarpper.setServerId(gdFalconUtil.getServerId());
        loginWarpper.setTerminalId(tid);
//        String tid = gdFalconUtil.createTerminal(driver.getPhone());
//        loginWarpper.setServerId(gdFalconUtil.getServerId());
//        loginWarpper.setTerminalId(tid);
        return ResultUtil.success(loginWarpper);
    }
@@ -1285,7 +1352,7 @@
            driverOrdersMapper.insert(query);
        }
        DriverWork driverWork = driverWorkMapper.queryNewWork(driver.getId(), 2, 1);
        if(null == driverWork){
        if (null == driverWork) {
            driverWork = new DriverWork();
            driverWork.setStartTime(new Date());
            driverWork.setDriverId(driver.getId());
@@ -1293,20 +1360,20 @@
            driverWork.setType("2");
            driverWorkMapper.insert(driverWork);
        }
        if(driver.getState() == 1){
        if (driver.getState() == 1) {
            driver.setState(2);
            driverMapper.updateById(driver);
        }
        this.singlePointLogin(driver.getId());//清除缓存实现单点登录
        //封装请求账号密码为shiro可验证的token
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(driver.getPhone(), identification.toCharArray());
        String credentials = ShiroKit.md5(driver.getIdCard(), salt);
        ByteSource credentialsSalt = new Md5Hash(salt);
        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
                new ShiroUser(), credentials, credentialsSalt, "");
        //校验用户账号密码
        HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
        md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
@@ -1314,20 +1381,20 @@
        boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch(
                usernamePasswordToken, simpleAuthenticationInfo);
        String s = JwtTokenUtil.generateToken(String.valueOf(driver.getId()));
        redisUtil.setStrValue(s.substring(s.length() - 32), String.valueOf(driver.getId()), 7 * 24 * 60 * 60);
        redisUtil.setStrValue(driver.getPhone(), s.substring(s.length() - 32));
        redisUtil.setStrValue("DRIVER_" + driver.getId(), s);
        redisTemplate.opsForValue().set(s.substring(s.length() - 32), String.valueOf(driver.getId()), 7, TimeUnit.DAYS);
        redisTemplate.opsForValue().set(driver.getPhone(), s.substring(s.length() - 32));
        redisTemplate.opsForValue().set("DRIVER_" + driver.getId(), s);
        LoginWarpper loginWarpper = new LoginWarpper();
        loginWarpper.setId(driver.getId());
        loginWarpper.setToken(s);
        loginWarpper.setAppid(UUIDUtil.getRandomCode());
        //创建高德猎鹰的终端数据
        String tid = gdFalconUtil.createTerminal(driver.getPhone());
        loginWarpper.setServerId(gdFalconUtil.getServerId());
        loginWarpper.setTerminalId(tid);
//        String tid = gdFalconUtil.createTerminal(driver.getPhone());
//        loginWarpper.setServerId(gdFalconUtil.getServerId());
//        loginWarpper.setTerminalId(tid);
        return ResultUtil.success(loginWarpper);
    }
@@ -1371,7 +1438,7 @@
            driverOrdersMapper.insert(query);
        }
        DriverWork driverWork = driverWorkMapper.queryNewWork(driver.getId(), 2, 1);
        if(null == driverWork){
        if (null == driverWork) {
            driverWork = new DriverWork();
            driverWork.setStartTime(new Date());
            driverWork.setDriverId(driver.getId());
@@ -1379,20 +1446,20 @@
            driverWork.setType("2");
            driverWorkMapper.insert(driverWork);
        }
        if(driver.getState() == 1){
        if (driver.getState() == 1) {
            driver.setState(2);
            driverMapper.updateById(driver);
        }
        this.singlePointLogin(driver.getId());//清除缓存实现单点登录
        //封装请求账号密码为shiro可验证的token
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(driver.getPhone(), taxiAptitudeCard.toCharArray());
        String credentials = ShiroKit.md5(driver.getTaxiAptitudeCard(), salt);
        ByteSource credentialsSalt = new Md5Hash(salt);
        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
                new ShiroUser(), credentials, credentialsSalt, "");
        //校验用户账号密码
        HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
        md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
@@ -1400,20 +1467,20 @@
        boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch(
                usernamePasswordToken, simpleAuthenticationInfo);
        String s = JwtTokenUtil.generateToken(String.valueOf(driver.getId()));
        redisUtil.setStrValue(s.substring(s.length() - 32), String.valueOf(driver.getId()), 7 * 24 * 60 * 60);
        redisUtil.setStrValue(driver.getPhone(), s.substring(s.length() - 32));
        redisUtil.setStrValue("DRIVER_" + driver.getId(), s);
        redisTemplate.opsForValue().set(s.substring(s.length() - 32), String.valueOf(driver.getId()), 7, TimeUnit.DAYS);
        redisTemplate.opsForValue().set(driver.getPhone(), s.substring(s.length() - 32));
        redisTemplate.opsForValue().set("DRIVER_" + driver.getId(), s);
        LoginWarpper loginWarpper = new LoginWarpper();
        loginWarpper.setId(driver.getId());
        loginWarpper.setToken(s);
        loginWarpper.setAppid(UUIDUtil.getRandomCode());
        //创建高德猎鹰的终端数据
        String tid = gdFalconUtil.createTerminal(driver.getPhone());
        loginWarpper.setServerId(gdFalconUtil.getServerId());
        loginWarpper.setTerminalId(tid);
//        String tid = gdFalconUtil.createTerminal(driver.getPhone());
//        loginWarpper.setServerId(gdFalconUtil.getServerId());
//        loginWarpper.setTerminalId(tid);
        return ResultUtil.success(loginWarpper);
    }
@@ -1426,12 +1493,12 @@
    public void taskOffWork() throws Exception {
        List<Driver> drivers = driverMapper.selectList(new EntityWrapper<Driver>().eq("authState", 2).ne("state", 3));
        Long now = Long.valueOf(System.currentTimeMillis());
        for(Driver driver : drivers){
            String value = redisUtil.getValue("DEVICE_" + driver.getId());
            if(ToolUtil.isNotEmpty(value) && now.compareTo(Long.valueOf(value) + (60 * 60 * 1000)) > 0){
        for (Driver driver : drivers) {
            String value = (String) redisTemplate.opsForValue().get("DEVICE_" + driver.getId());
            if (ToolUtil.isNotEmpty(value) && now.compareTo(Long.valueOf(value) + (60 * 60 * 1000)) > 0) {
                driver.setState(1);
                driverMapper.updateById(driver);
                redisUtil.remove("DEVICE_" + driver.getId());
                redisTemplate.delete("DEVICE_" + driver.getId());
            }
        }
    }
@@ -1508,40 +1575,211 @@
    public ResultUtil loginOut(Integer id) throws Exception {
        //开始清除redis中无效的数据
        Driver driver = driverMapper.selectById(id);
        String key = redisUtil.getValue(driver.getPhone());
        redisUtil.remove(key);//删除个人信息数据
        redisUtil.remove("DRIVER_" + driver.getPhone());//删除后台冻结相关缓存
        redisUtil.remove("DRIVER_" + id);//清除存储的token
        redisUtil.remove("DEVICE_" + id);//清除车载端登录的标识
        String key = (String) redisTemplate.opsForValue().get(driver.getPhone());
        redisTemplate.delete(key);//删除个人信息数据
        redisTemplate.delete("DRIVER_" + driver.getPhone());//删除后台冻结相关缓存
        redisTemplate.delete("DRIVER_" + id);//清除存储的token
        redisTemplate.delete("DEVICE_" + id);//清除车载端登录的标识
        return ResultUtil.success();
    }
    @Override
    public DriverIndexVo queryHomeDataFromDriver(Integer uid) {
        DriverIndexVo driverIndexVo = new DriverIndexVo();
        // 获取快车订单
        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().ne("state", 10).eq("driverId", uid).like("insertTime", LocalDateTime.now().toString()));
        // 跨城订单
        List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.selectList(new EntityWrapper<OrderCrossCity>().ne("state", 10).eq("driverId", uid).like("insertTime", LocalDateTime.now().toString()));
        // 出租车订单
        List<OrderTaxi> orderTaxis = orderTaxiMapper.selectList(new EntityWrapper<OrderTaxi>().ne("state", 10).eq("driverId", uid).like("insertTime", LocalDateTime.now().toString()));
        driverIndexVo.setTodayOrderNum(orderPrivateCars.size() + orderCrossCities.size() + orderTaxis.size());
    /**
     * 获取编号
     * @return
     */
    public String getCode(){
        int count = driverMapper.getCount();
        String code = String.valueOf(1000001 + count);
        return "D" + code.substring(1);
        double sum = orderPrivateCars.stream().mapToDouble(OrderPrivateCar::getOrderMoney).sum();
        double sum1 = orderCrossCities.stream().mapToDouble(OrderCrossCity::getOrderMoney).sum();
        double sum2 = orderTaxis.stream().mapToDouble(OrderTaxi::getOrderMoney).sum();
        driverIndexVo.setTodayOrderMoney(new BigDecimal(sum +sum1+sum2));
        BigDecimal reduce = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().eq("promotionDriverId", uid).like("insertTime", LocalDateTime.now().toString())).stream().map(OrderPrivateCar::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal reduce1 = orderCrossCityMapper.selectList(new EntityWrapper<OrderCrossCity>().eq("promotionDriverId", uid).like("insertTime", LocalDateTime.now().toString())).stream().map(OrderCrossCity::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal reduce2 = orderTaxiMapper.selectList(new EntityWrapper<OrderTaxi>().eq("promotionDriverId", uid).like("insertTime", LocalDateTime.now().toString())).stream().map(OrderTaxi::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        driverIndexVo.setTodayPromotionMoney(reduce.add(reduce1).add(reduce2));
        return driverIndexVo;
    };
    @Override
    public DriverOrderDataVo queryOrderDataFromDriver(String time, Page<DriverOrderDataNextVo> driverOrderDataVoPage, Integer uid) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM");
        // 总的订单数
        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().ne("state", 10).eq("driverId", uid));
        // 跨城订单
        List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.selectList(new EntityWrapper<OrderCrossCity>().ne("state", 10).eq("driverId", uid));
        // 出租车订单
        List<OrderTaxi> orderTaxis = orderTaxiMapper.selectList(new EntityWrapper<OrderTaxi>().ne("state", 10).eq("driverId", uid));
        DriverOrderDataVo driverOrderDataVo = new DriverOrderDataVo();
        driverOrderDataVo.setAllOrderNum(orderPrivateCars.size() + orderCrossCities.size() + orderTaxis.size());
        long count = orderPrivateCars.stream().filter(e -> simpleDateFormat.format(e.getInsertTime()).equals(LocalDateTime.now().toString())).count();
        long count1 = orderCrossCities.stream().filter(e -> simpleDateFormat.format(e.getInsertTime()).equals(LocalDateTime.now().toString())).count();
        long count2 = orderTaxis.stream().filter(e -> simpleDateFormat.format(e.getInsertTime()).equals(LocalDateTime.now().toString())).count();
        driverOrderDataVo.setTodayOrderNum((int) (count+count1+count2));
        Date date = new Date();
        String month = simpleDateFormat1.format(date);
        long count3 = orderPrivateCars.stream().filter(e -> simpleDateFormat1.format(e.getInsertTime()).equals(month)).count();
        long count4 = orderCrossCities.stream().filter(e -> simpleDateFormat1.format(e.getInsertTime()).equals(month)).count();
        long count5 = orderTaxis.stream().filter(e -> simpleDateFormat1.format(e.getInsertTime()).equals(month)).count();
        driverOrderDataVo.setMonthOrderNum((int) (count3+count4+count5));
        String sTime=null;
        String eTime=null;
        if(ToolUtil.isNotEmpty( time)){
            sTime=time.split(" - ")[0]+" 00:00:00";
            eTime=time.split(" - ")[1]+" 23:59:59";
        }
        List<DriverOrderDataNextVo> driverOrderDataNextVoPage = driverServiceMapper.queryOrderDataFromDriver(sTime, eTime, driverOrderDataVoPage, uid);
        driverOrderDataVoPage.setRecords(driverOrderDataNextVoPage);
        driverOrderDataVo.setDriverOrderDataNextVos(driverOrderDataVoPage);
        return driverOrderDataVo;
    }
    @Override
    public DriverOrderMoneyDataVo queryOrderMoneyFromDriver(String time, Page<DriverOrderDataNextVo> driverOrderDataVoPage, Integer uid) {
        DriverOrderMoneyDataVo driverOrderDataVo = new DriverOrderMoneyDataVo();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM");
        // 总的订单数
        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().in("state",Arrays.asList(8,9)).eq("driverId", uid));
        // 跨城订单
        List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.selectList(new EntityWrapper<OrderCrossCity>().in("state",Arrays.asList(8,9)).eq("driverId", uid));
        // 出租车订单
        List<OrderTaxi> orderTaxis = orderTaxiMapper.selectList(new EntityWrapper<OrderTaxi>().in("state",Arrays.asList(8,9)).eq("driverId", uid));
        double sum = orderPrivateCars.stream().mapToDouble(OrderPrivateCar::getOrderMoney).sum();
        double sum1 = orderCrossCities.stream().mapToDouble(OrderCrossCity::getOrderMoney).sum();
        double sum2 = orderTaxis.stream().mapToDouble(OrderTaxi::getOrderMoney).sum();
        driverOrderDataVo.setAllOrderMoney(new BigDecimal(sum +sum1+sum2));
        double count = orderPrivateCars.stream().filter(e -> simpleDateFormat.format(e.getInsertTime()).equals(LocalDateTime.now().toString())).mapToDouble(OrderPrivateCar::getOrderMoney).sum();
        double count1 = orderCrossCities.stream().filter(e -> simpleDateFormat.format(e.getInsertTime()).equals(LocalDateTime.now().toString())).mapToDouble(OrderCrossCity::getOrderMoney).sum();
        double count2 = orderTaxis.stream().filter(e -> simpleDateFormat.format(e.getInsertTime()).equals(LocalDateTime.now().toString())).mapToDouble(OrderTaxi::getOrderMoney).sum();
        driverOrderDataVo.setTodayOrderMoney(new BigDecimal(count+count1+count2));
        Date date = new Date();
        String month = simpleDateFormat1.format(date);
        double count3 = orderPrivateCars.stream().filter(e -> simpleDateFormat1.format(e.getInsertTime()).equals(month)).mapToDouble(OrderPrivateCar::getOrderMoney).sum();
        double count4 = orderCrossCities.stream().filter(e -> simpleDateFormat1.format(e.getInsertTime()).equals(month)).mapToDouble(OrderCrossCity::getOrderMoney).sum();
        double count5 = orderTaxis.stream().filter(e -> simpleDateFormat1.format(e.getInsertTime()).equals(month)).mapToDouble(OrderTaxi::getOrderMoney).sum();
        driverOrderDataVo.setMonthOrderMoney(new BigDecimal(count3+count4+count5));
        String sTime=null;
        String eTime=null;
        if(ToolUtil.isNotEmpty( time)){
            sTime=time.split(" - ")[0]+" 00:00:00";
            eTime=time.split(" - ")[1]+" 23:59:59";
        }
        List<DriverOrderDataNextVo> driverOrderDataNextVoPage = driverServiceMapper.queryOrderMoneyDataFromDriver(sTime, eTime, driverOrderDataVoPage, uid);
        List<DriverOrderDataNextVo> driverOrderDataNextVoPage1 = driverServiceMapper.queryOrderMoneyDataFromDriverAll(sTime, eTime, uid);
        double sum3 = driverOrderDataNextVoPage1.stream().mapToDouble(DriverOrderDataNextVo::getOrderMoney).sum();
        driverOrderDataVo.setSearchMoney(new BigDecimal(sum3));
        driverOrderDataVoPage.setRecords(driverOrderDataNextVoPage);
        driverOrderDataVo.setDriverOrderDataNextVos(driverOrderDataVoPage);
        return driverOrderDataVo;
    }
    @Override
    public DriverOrderPromotionDataVo queryOrderPromotionFromDriver(String time, Page<DriverOrderDataNextVo> driverOrderDataVoPage, Integer uid) {
        DriverOrderPromotionDataVo driverOrderDataVo = new DriverOrderPromotionDataVo();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM");
        // 总的订单数
        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().in("state",Arrays.asList(8,9)).eq("promotionDriverId", uid));
        // 跨城订单
        List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.selectList(new EntityWrapper<OrderCrossCity>().in("state",Arrays.asList(8,9)).eq("promotionDriverId", uid));
        // 出租车订单
        List<OrderTaxi> orderTaxis = orderTaxiMapper.selectList(new EntityWrapper<OrderTaxi>().in("state",Arrays.asList(8,9)).eq("promotionDriverId", uid));
        BigDecimal sum = orderPrivateCars.stream().map(OrderPrivateCar::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal sum1 = orderCrossCities.stream().map(OrderCrossCity::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal sum2 = orderTaxis.stream().map(OrderTaxi::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        driverOrderDataVo.setAllOrderMoney(sum.add(sum1).add(sum2));
        BigDecimal count = orderPrivateCars.stream().filter(e -> simpleDateFormat.format(e.getInsertTime()).equals(LocalDateTime.now().toString())).map(OrderPrivateCar::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal count1 = orderCrossCities.stream().filter(e -> simpleDateFormat.format(e.getInsertTime()).equals(LocalDateTime.now().toString())).map(OrderCrossCity::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal count2 = orderTaxis.stream().filter(e -> simpleDateFormat.format(e.getInsertTime()).equals(LocalDateTime.now().toString())).map(OrderTaxi::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        driverOrderDataVo.setTodayOrderMoney(count.add(count1).add(count2));
        Date date = new Date();
        String month = simpleDateFormat1.format(date);
        BigDecimal count3 = orderPrivateCars.stream().filter(e -> simpleDateFormat1.format(e.getInsertTime()).equals(month)).map(OrderPrivateCar::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal count4 = orderCrossCities.stream().filter(e -> simpleDateFormat1.format(e.getInsertTime()).equals(month)).map(OrderCrossCity::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal count5 = orderTaxis.stream().filter(e -> simpleDateFormat1.format(e.getInsertTime()).equals(month)).map(OrderTaxi::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        driverOrderDataVo.setMonthOrderMoney(count3.add(count4).add(count5));
        String sTime=null;
        String eTime=null;
        if(ToolUtil.isNotEmpty( time)){
            sTime=time.split(" - ")[0]+" 00:00:00";
            eTime=time.split(" - ")[1]+" 23:59:59";
        }
        List<DriverOrderDataNextVo> driverOrderDataNextVoPage = driverServiceMapper.queryOrderPromotionFromDriver(sTime, eTime, driverOrderDataVoPage, uid);
        List<DriverOrderDataNextVo> driverOrderDataNextVoPage1 =driverServiceMapper.queryOrderPromotionFromDriverAll(sTime, eTime, uid);
        double sum3 = driverOrderDataNextVoPage1.stream().mapToDouble(DriverOrderDataNextVo::getOrderMoney).sum();
        driverOrderDataVo.setSearchMoney(new BigDecimal(sum3));
        driverOrderDataVoPage.setRecords(driverOrderDataNextVoPage);
        driverOrderDataVo.setDriverOrderDataNextVos(driverOrderDataVoPage);
        return driverOrderDataVo;
    }
    /**
     * 单点登录
     *
     * @param id
     */
    private void singlePointLogin(Integer id) {
        //开始验证当前账号是否在别处登录
        String value = (String) redisTemplate.opsForValue().get("DRIVER_" + id);
        if (ToolUtil.isNotEmpty(value)) {//将另外设备上的强迫下线(如果是车载端不需要下线)
            //开始清除redis中无效的数据
            Driver driver = driverMapper.selectById(id);
            String key = (String) redisTemplate.opsForValue().get("DRIVER_" + driver.getPhone());
            if(ToolUtil.isNotEmpty(key)){
                redisTemplate.delete(key);//删除个人信息数据
            }
            redisTemplate.delete("DRIVER_" + driver.getPhone());//删除后台冻结相关缓存
            redisTemplate.delete("DRIVER_" + id);//清除存储的token
        }
    }
    /**
     * 获取token
     *
     * @param driver
     * @param password
     * @return
     */
    private String getToken(Driver driver, String password){
    private String getToken(Driver driver, String password) {
        //封装请求账号密码为shiro可验证的token
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(driver.getPhone(), password.toCharArray());
        String credentials = driver.getPassword();
        ByteSource credentialsSalt = new Md5Hash(salt);
        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
                new ShiroUser(), credentials, credentialsSalt, "");
        //校验用户账号密码
        HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
        md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
@@ -1549,30 +1787,21 @@
        boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch(
                usernamePasswordToken, simpleAuthenticationInfo);
        String s = JwtTokenUtil.generateToken(String.valueOf(driver.getId()));
        redisUtil.setStrValue(s.substring(s.length() - 32), String.valueOf(driver.getId()), 7 * 24 * 60 * 60);
        redisUtil.setStrValue("DRIVER_" + driver.getPhone(), s.substring(s.length() - 32));
        redisUtil.setStrValue("DRIVER_" + driver.getId(), s);
        redisTemplate.opsForValue().set(s.substring(s.length() - 32), String.valueOf(driver.getId()), 7, TimeUnit.DAYS);
        redisTemplate.opsForValue().set("DRIVER_" + driver.getPhone(), s.substring(s.length() - 32));
        redisTemplate.opsForValue().set("DRIVER_" + driver.getId(), s);
        return s;
    }
    /**
     * 单点登录
     * @param id
     * 获取编号
     *
     * @return
     */
    private void singlePointLogin(Integer id){
        //开始验证当前账号是否在别处登录
        String value = redisUtil.getValue("DRIVER_" + id);
        if(ToolUtil.isNotEmpty(value)){//将另外设备上的强迫下线(如果是车载端不需要下线)
            //开始清除redis中无效的数据
            Driver driver = driverMapper.selectById(id);
            String key = redisUtil.getValue("DRIVER_" + driver.getPhone());
            redisUtil.remove(key);//删除个人信息数据
            redisUtil.remove("DRIVER_" + driver.getPhone());//删除后台冻结相关缓存
            redisUtil.remove("DRIVER_" + id);//清除存储的token
        }
    public String getCode() {
        int count = driverMapper.getCount();
        String code = String.valueOf(1000001 + count);
        return "D" + code.substring(1);
    }
}