From 8675ddc7e76f418ee47adc50ee7bac35171a9620 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期日, 15 六月 2025 01:59:48 +0800 Subject: [PATCH] 更新司机端中台接口 --- DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java | 279 ++++++++++++++++++++++++++++++++----------------------- 1 files changed, 160 insertions(+), 119 deletions(-) diff --git a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java index af01a12..51414dd 100644 --- a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java +++ b/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); } - + } -- Gitblit v1.7.1