Pu Zhibing
5 天以前 8675ddc7e76f418ee47adc50ee7bac35171a9620
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -1,7 +1,5 @@
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.service.impl.ServiceImpl;
import com.stylefeng.guns.core.common.constant.JwtConstants;
@@ -14,6 +12,11 @@
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.*;
import com.stylefeng.guns.modular.system.util.qianyuntong.EmployeeUtil;
import com.stylefeng.guns.modular.system.util.qianyuntong.SMSUtil;
import com.stylefeng.guns.modular.system.util.qianyuntong.model.EditStaffNodeRequest;
import com.stylefeng.guns.modular.system.util.qianyuntong.model.GetStaffNodeRequest;
import com.stylefeng.guns.modular.system.util.qianyuntong.model.StaffNodeInfo;
import com.stylefeng.guns.modular.system.warpper.ActivityWarpper;
import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
import com.stylefeng.guns.modular.system.warpper.LoginWarpper;
@@ -26,6 +29,7 @@
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;
@@ -33,6 +37,7 @@
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Service
@@ -61,46 +66,46 @@
    @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;
    private RedisTemplate redisTemplate;
    @Autowired
    private ALiSendSms aLiSendSms;
    @Autowired
    private ICompanyCityService companyCityService;
    @Autowired
    private GDFalconUtil gdFalconUtil;
    @Autowired
    private IOrderService orderService;
    @Autowired
    private ISmsrecordService smsrecordService;
    @Autowired
    private ICarService carService;
    @Autowired
    private IReassignService reassignService;
@@ -143,16 +148,16 @@
    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);//设置五分钟过期
        redisTemplate.opsForValue().set(phone, authCode, 5, TimeUnit.MINUTES);//设置五分钟过期
        String templateCode = "";
        switch (type){
        switch (type) {
            case 1:
                templateCode = "SMS_154775435";//身份验证
                break;
@@ -166,13 +171,14 @@
                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);
//        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);
        SMSUtil.sendVerifyCode(phone);
        return ResultUtil.success();
    }
@@ -186,7 +192,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;
        }
@@ -456,34 +462,44 @@
    @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){
        //查询中台员工数据
        GetStaffNodeRequest request = new GetStaffNodeRequest();
        request.setEmpId(driver.getEmpId());
        request.setEntercode(driver.getEntercode());
        request.setMobile(driver.getPhone());
        StaffNodeInfo staffNode = EmployeeUtil.getStaffNode(request);
        if (null == staffNode || staffNode.getIsValid().equals("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);
        //创建高德猎鹰的终端数据
        String tid = gdFalconUtil.createTerminal(phone);
        loginWarpper.setServerId(gdFalconUtil.getServerId());
@@ -524,7 +540,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 +773,45 @@
    @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);
        GetStaffNodeRequest request = new GetStaffNodeRequest();
        request.setEmpId(driver1.getEmpId());
        request.setEntercode(driver1.getEntercode());
        request.setMobile(driver1.getPhone());
        StaffNodeInfo staffNode = EmployeeUtil.getStaffNode(request);
        if ("0".equals(staffNode.getIsValid())) {
            return ResultUtil.error("无效的司机账号");
        }
        EditStaffNodeRequest editStaffNodeRequest = new EditStaffNodeRequest();
        editStaffNodeRequest.setEmpId(staffNode.getEmpId());
        editStaffNodeRequest.setMobile(staffNode.getMphone());
        editStaffNodeRequest.setEntercode(staffNode.getEnterNum());
        editStaffNodeRequest.setEnterId(staffNode.getEnterId());
        editStaffNodeRequest.setEmpName(staffNode.getEmpName());
        editStaffNodeRequest.setEmpNickname(staffNode.getEmpNickname());
        editStaffNodeRequest.setLoginNo(staffNode.getLoginNo());
        editStaffNodeRequest.setMphone(phone);
        editStaffNodeRequest.setEmail(staffNode.getEmail());
        editStaffNodeRequest.setDeptId(staffNode.getDeptId());
        editStaffNodeRequest.setPositionId(1);
        editStaffNodeRequest.setSuperLevel(0);
        editStaffNodeRequest.setHideMobile(0);
        Boolean editStaffNode = EmployeeUtil.editStaffNode(editStaffNodeRequest);
        if (!editStaffNode) {
            return ResultUtil.error("修改手机号码失败");
        }
        driver1.setAccount(phone);
        driver1.setPhone(phone);
        this.updateById(driver1);
        smsrecordService.saveData(7, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
        return ResultUtil.success();
    }
@@ -1187,7 +1230,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 +1238,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,16 +1261,16 @@
        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());
@@ -1285,7 +1328,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 +1336,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,16 +1357,16 @@
        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());
@@ -1371,7 +1414,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 +1422,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,16 +1443,16 @@
        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());
@@ -1426,12 +1469,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 +1551,47 @@
    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();
    }
    /**
     * 获取编号
     * @return
     * 单点登录
     *
     * @param id
     */
    public String getCode(){
        int count = driverMapper.getCount();
        String code = String.valueOf(1000001 + count);
        return "D" + code.substring(1);
    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());
            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 +1599,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);
    }
}