package com.agentdriving.driver.modular.system.service.impl;
|
|
import com.agentdriving.driver.core.common.constant.JwtConstants;
|
import com.agentdriving.driver.core.shiro.ShiroKit;
|
import com.agentdriving.driver.core.shiro.ShiroUser;
|
import com.agentdriving.driver.core.util.JwtTokenUtil;
|
import com.agentdriving.driver.core.util.ToolUtil;
|
import com.agentdriving.driver.modular.system.dao.DriverMapper;
|
import com.agentdriving.driver.modular.system.model.*;
|
import com.agentdriving.driver.modular.system.service.*;
|
import com.agentdriving.driver.modular.system.util.*;
|
import com.agentdriving.driver.modular.system.util.juhe.OCRUtil;
|
import com.agentdriving.driver.modular.system.util.mongodb.model.Location;
|
import com.agentdriving.driver.modular.system.util.rongyun.RongYunUtil;
|
import com.agentdriving.driver.modular.system.warpper.*;
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
|
import org.apache.shiro.authc.SimpleAuthenticationInfo;
|
import org.apache.shiro.authc.UsernamePasswordToken;
|
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
|
import org.apache.shiro.crypto.hash.Md5Hash;
|
import org.apache.shiro.util.ByteSource;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.data.geo.Circle;
|
import org.springframework.data.geo.Distance;
|
import org.springframework.data.geo.Metrics;
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
|
import org.springframework.data.mongodb.core.query.Criteria;
|
import org.springframework.data.mongodb.core.query.Query;
|
import org.springframework.data.mongodb.core.query.Update;
|
import org.springframework.stereotype.Service;
|
import org.springframework.web.context.request.RequestContextHolder;
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
/**
|
* 司机
|
* @author pzb
|
* @Date 2023/2/8 18:52
|
*/
|
@Service
|
public class DriverServiceImpl extends ServiceImpl<DriverMapper, Driver> implements IDriverService {
|
|
private final String salt = "i#sm4";
|
|
@Autowired
|
private IBranchOfficeService branchOfficeService;
|
|
@Autowired
|
private RedisUtil redisUtil;
|
|
@Autowired
|
private MongoTemplate mongoTemplate;
|
|
@Autowired
|
private IOrderPositionService orderPositionService;
|
|
@Autowired
|
private IDriverWorkService driverWorkService;
|
|
@Value("${filePath}")
|
private String filePath;
|
|
@Autowired
|
private IAppUserService appUserService;
|
|
@Autowired
|
private ISystemConfigService systemConfigService;
|
|
@Autowired
|
private IAccountChangeDetailService accountChangeDetailService;
|
|
@Autowired
|
private IYouTuiDriverService youTuiDriverService;
|
|
@Autowired
|
private IOrderService orderService;
|
|
@Autowired
|
private PayMoneyUtil payMoneyUtil;
|
|
@Autowired
|
private IRechargeRecordService rechargeRecordService;
|
|
@Autowired
|
private IAgentService agentService;
|
|
@Autowired
|
private RongYunUtil rongYunUtil;
|
|
@Autowired
|
private PushUtil pushUtil;
|
|
|
|
/**
|
* 司机注册
|
* @param driverRegisterWarpper
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil driverRegister(DriverRegisterWarpper driverRegisterWarpper) throws Exception {
|
Driver driver = this.selectOne(new EntityWrapper<Driver>().eq("phone", driverRegisterWarpper.getPhone()).ne("status", 3));
|
if(null != driver && driver.getStatus() == 2){
|
return ResultUtil.error("该手机账号已被冻结,请联系管理员。");
|
}
|
if(null != driver && driver.getApprovalStatus() == 1){
|
return ResultUtil.error("该手机账号正在审核中。");
|
}
|
if(null != driver && driver.getApprovalStatus() == 2){
|
return ResultUtil.error("该手机账号已审核通过,请直接登录。");
|
}
|
|
//账号审核拒绝后的处理
|
if(null != driver && driver.getApprovalStatus() == 3){
|
try {
|
driver = new Driver();
|
driver = setDriverParamete(driver, driverRegisterWarpper);
|
driver.setCreateTime(new Date());
|
}catch (Exception e){
|
return ResultUtil.error(e.getMessage());
|
}
|
this.insert(driver);
|
}
|
//新账号
|
if(null == driver){
|
driver = new Driver();
|
driver.setCode(UUIDUtil.getNumberRandom(16));
|
try {
|
driver = setDriverParamete(driver, driverRegisterWarpper);
|
}catch (Exception e){
|
return ResultUtil.error(e.getMessage());
|
}
|
driver.setCreateTime(new Date());
|
this.insert(driver);
|
|
//司机邀请注册奖励
|
if(null != driver.getInviterId()){
|
Driver driver1 = this.selectById(driver.getInviterId());
|
SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 4));
|
if(null != systemConfig){
|
Integer num7 = JSON.parseObject(systemConfig.getContent()).getInteger("num7");
|
if(num7 > 0){
|
AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
|
accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
|
accountChangeDetail.setUserType(2);
|
accountChangeDetail.setUserId(driver1.getId());
|
accountChangeDetail.setType(2);
|
accountChangeDetail.setChangeType(5);
|
accountChangeDetail.setOldData(driver1.getIntegral().doubleValue());
|
driver1.setIntegral(driver1.getIntegral() + num7);
|
accountChangeDetail.setNewData(driver1.getIntegral().doubleValue());
|
accountChangeDetail.setExplain("邀请司机注册奖励");
|
accountChangeDetailService.saveData(accountChangeDetail);
|
this.updateById(driver1);
|
}
|
}
|
}
|
}
|
return ResultUtil.success();
|
}
|
|
|
/**
|
* 组装个人信息
|
* @param driver
|
* @param driverRegisterWarpper
|
* @return
|
*/
|
public Driver setDriverParamete(Driver driver, DriverRegisterWarpper driverRegisterWarpper) throws Exception{
|
driver.setName(driverRegisterWarpper.getName());
|
driver.setSex(driverRegisterWarpper.getSex());
|
driver.setAvatar(driverRegisterWarpper.getAvatar());
|
driver.setPhone(driverRegisterWarpper.getPhone());
|
driver.setEmergencyContact(driverRegisterWarpper.getEmergencyContact());
|
driver.setEmergencyPhone(driverRegisterWarpper.getEmergencyPhone());
|
driver.setIdcard(driverRegisterWarpper.getIdcard());
|
driver.setIdcardBack(driverRegisterWarpper.getIdcardBack());
|
driver.setIdcardFront(driverRegisterWarpper.getIdcardFront());
|
driver.setDriverLicenseNumber(driverRegisterWarpper.getIdcard());
|
driver.setDriverLicense(driverRegisterWarpper.getDriverLicense());
|
driver.setFirstCertificateTime(driverRegisterWarpper.getFirstCertificateTime());
|
//注册地
|
String code = driverRegisterWarpper.getCode();
|
BranchOffice branchOffice = branchOfficeService.selectOne(new EntityWrapper<BranchOffice>().eq("districtCode", code).eq("status", 1));
|
if(null == branchOffice){
|
throw new Exception("该区域无服务商");
|
}
|
driver.setBranchOfficeId(branchOffice.getId());
|
driver.setAgentId(branchOffice.getAgentId());
|
driver.setProvinceCode(branchOffice.getProvinceCode());
|
driver.setProvinceName(branchOffice.getProvinceName());
|
driver.setCityName(branchOffice.getCityName());
|
driver.setCityCode(branchOffice.getCityCode());
|
driver.setAreaCode(branchOffice.getDistrictCode());
|
driver.setAreaName(branchOffice.getDistrictName());
|
driver.setInviterType(driverRegisterWarpper.getInviterType());
|
driver.setInviterId(driverRegisterWarpper.getInviterId());
|
driver.setApprovalStatus(1);
|
driver.setApprovalNotes("");
|
driver.setApprovalTime(null);
|
driver.setApprovalUserId(null);
|
driver.setStatus(1);
|
driver.setSource(driverRegisterWarpper.getSource());
|
return driver;
|
}
|
|
|
/**
|
* 司机登录逻辑
|
* @param receiver 国家代码+86
|
* @param phone 登录手机号
|
* @param code 短信验证码
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil<TokenWarpper> driverLogin(String receiver, String phone, String code) throws Exception {
|
if(ToolUtil.isEmpty(receiver)){
|
receiver = "+86";
|
}
|
String value = redisUtil.getValue(receiver + phone);
|
if(!"12345".equals(code) && ToolUtil.isEmpty(value)){
|
return ResultUtil.error("短信验证码无效");
|
}
|
if(!"12345".equals(code) && !value.equals(code)){
|
return ResultUtil.error("短信验证码无效");
|
}
|
Driver driver = this.selectOne(new EntityWrapper<Driver>().eq("phone", phone).ne("status", 3));
|
if(null == driver){
|
return ResultUtil.error("请先进行注册");
|
}
|
if(driver.getStatus() == 2){
|
return ResultUtil.error("账号已被冻结,请联系管理员。");
|
}
|
if(driver.getApprovalStatus() == 1){
|
return ResultUtil.error("账号正在审核中。");
|
}
|
if(driver.getApprovalStatus() == 3){
|
return ResultUtil.error("账号审核不通过,请重新申请。");
|
}
|
String token = getToken(phone, code);
|
if(ToolUtil.isEmpty(token)){
|
return ResultUtil.error("登录异常,请联系管理员。");
|
}
|
TokenWarpper tokenWarpper = new TokenWarpper();
|
tokenWarpper.setToken(token);
|
tokenWarpper.setValidTime(7200L);
|
tokenWarpper.setIsSetPassword(ToolUtil.isEmpty(driver.getPassword()) ? 0 : 1);
|
|
String RYToken = rongYunUtil.getToken(driver.getId().toString(), driver.getName(), driver.getAvatar());
|
if(ToolUtil.isNotEmpty(RYToken)){
|
JSONObject jsonObject = JSON.parseObject(RYToken);
|
Integer code1 = jsonObject.getInteger("code");
|
if(200 == code1){
|
tokenWarpper.setRytoken(jsonObject.getString("token"));
|
}
|
}
|
|
return ResultUtil.success(tokenWarpper);
|
}
|
|
|
/**
|
* 司机密码登录
|
* @param receiver 国家代码+86
|
* @param phone 手机号
|
* @param password 密码
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil<TokenWarpper> driverPassLogin(String receiver, String phone, String password) throws Exception {
|
Driver driver = this.selectOne(new EntityWrapper<Driver>().eq("phone", phone).ne("status", 3));
|
if(null == driver){
|
return ResultUtil.error("请先进行注册");
|
}
|
if(driver.getStatus() == 2){
|
return ResultUtil.error("账号已被冻结,请联系管理员。");
|
}
|
if(driver.getApprovalStatus() == 1){
|
return ResultUtil.error("账号正在审核中。");
|
}
|
if(driver.getApprovalStatus() == 3){
|
return ResultUtil.error("账号审核不通过,请重新申请。");
|
}
|
if(ToolUtil.isEmpty(password)){
|
return ResultUtil.error("密码无效");
|
}
|
if(ToolUtil.isEmpty(driver.getPassword())){
|
return ResultUtil.error("请先配置密码");
|
}
|
if(!driver.getPassword().equals(ShiroKit.md5(password, salt))){
|
return ResultUtil.error("账号密码错误。");
|
}
|
String token = getToken(phone, password);
|
if(ToolUtil.isEmpty(token)){
|
return ResultUtil.error("登录异常,请联系管理员。");
|
}
|
TokenWarpper tokenWarpper = new TokenWarpper();
|
tokenWarpper.setToken(token);
|
tokenWarpper.setValidTime(Integer.valueOf(7 * 24 * 60 * 60).longValue());
|
tokenWarpper.setIsSetPassword(ToolUtil.isEmpty(driver.getPassword()) ? 0 : 1);
|
String RYToken = rongYunUtil.getToken(driver.getId().toString(), driver.getName(), driver.getAvatar());
|
if(ToolUtil.isNotEmpty(RYToken)){
|
JSONObject jsonObject = JSON.parseObject(RYToken);
|
Integer code1 = jsonObject.getInteger("code");
|
if(200 == code1){
|
tokenWarpper.setRytoken(jsonObject.getString("token"));
|
}
|
}
|
return ResultUtil.success(tokenWarpper);
|
}
|
|
/**
|
* 获取身份凭证
|
* @param phone
|
* @param password
|
* @return
|
* @throws Exception
|
*/
|
private String getToken(String phone, String password) throws Exception{
|
//封装请求账号密码为shiro可验证的token
|
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(phone, password.toCharArray());
|
|
//获取数据库中的账号密码,准备比对
|
String credentials = ShiroKit.md5(password, salt);
|
Driver driver = this.selectOne(new EntityWrapper<Driver>().eq("phone", phone).eq("status", 1));
|
ByteSource credentialsSalt = new Md5Hash(salt);
|
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
|
new ShiroUser(), credentials, credentialsSalt, "");
|
|
//校验用户账号密码
|
HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
|
md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
|
md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations);
|
boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch(
|
usernamePasswordToken, simpleAuthenticationInfo);
|
|
if (passwordTrueFlag) {
|
String token = JwtTokenUtil.generateToken(phone + System.currentTimeMillis());
|
String key = token;
|
if(token.length() > 16){
|
key = token.substring(token.length() - 16);
|
}
|
redisUtil.setStrValue(key, driver.getId().toString(), 7 * 24 * 60 * 60);//7天
|
redisUtil.setStrValue("DRIVER_" + phone, key, 7 * 24 * 60 * 60);//7天
|
|
//下线
|
for (int i = 0; i < 5; i++) {
|
Integer code = pushUtil.pushOffline(driver.getId(), 2);
|
if(200 == code){
|
break;
|
}
|
}
|
return token;
|
}
|
return "";
|
}
|
|
|
/**
|
* 刷新token
|
* @param uid
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil<TokenWarpper> flushedToken(Integer uid) throws Exception {
|
Driver driver = this.selectById(uid);
|
String token = getToken(driver.getPhone(), driver.getPhone());
|
if(ToolUtil.isEmpty(token)){
|
return ResultUtil.error("刷新token异常,请联系管理员。");
|
}
|
TokenWarpper tokenWarpper = new TokenWarpper();
|
tokenWarpper.setToken(token);
|
tokenWarpper.setValidTime(7200L);
|
tokenWarpper.setIsSetPassword(ToolUtil.isEmpty(driver.getPassword()) ? 0 : 1);
|
return ResultUtil.success(tokenWarpper);
|
}
|
|
/**
|
* 校验token获取用户信息
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public Integer getUserByRequest() throws Exception {
|
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
|
HttpServletRequest request = servletRequestAttributes.getRequest();
|
String requestHeader = request.getHeader(JwtConstants.AUTH_HEADER);
|
if (ToolUtil.isNotEmpty(requestHeader) && requestHeader.startsWith("Bearer ")) {
|
requestHeader = requestHeader.substring(requestHeader.indexOf(" ") + 1);
|
String key = null;
|
int length = requestHeader.length();
|
if(length > 16){
|
key = requestHeader.substring(length - 16);
|
}else{
|
key = requestHeader;
|
}
|
String value = redisUtil.getValue(key);
|
return null != value ? Integer.valueOf(value) : null;
|
}else{
|
return null;
|
}
|
}
|
|
|
/**
|
* 设置司机密码
|
* @param uid
|
* @param password
|
* @throws Exception
|
*/
|
@Override
|
public void setPassword(Integer uid, String password) throws Exception {
|
Driver driver = this.selectById(uid);
|
driver.setPassword(ShiroKit.md5(password, salt));
|
this.updateById(driver);
|
}
|
|
|
@Override
|
public ResultUtil<List<String>> queryDriverPosition(Integer uid) throws Exception {
|
DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", uid).eq("status", 1));
|
if(null == driverWork){
|
return ResultUtil.error("请先上班", new ArrayList<>());
|
}
|
String value = redisUtil.getValue("DRIVER" + uid);
|
List<String> list = new ArrayList<>();
|
if(ToolUtil.isNotEmpty(value)){
|
String[] split = value.split(",");
|
String lon = split[0];
|
String lat = split[1];
|
//找到中心点
|
GeoJsonPoint geoJsonPoint = new GeoJsonPoint(Double.valueOf(lon), Double.valueOf(lat));
|
//构造半径
|
Distance distanceR = new Distance(5D, Metrics.KILOMETERS);
|
//画圆
|
Circle circle = new Circle(geoJsonPoint, distanceR);
|
// 构造query对象
|
Query query = Query.query(Criteria.where("location").withinSphere(circle));
|
List<Location> locations = mongoTemplate.find(query, Location.class);
|
locations.forEach(s -> {
|
String value1 = redisUtil.getValue("DRIVER" + s.getDriverId());
|
if(s.getDriverId().compareTo(uid) != 0 && ToolUtil.isNotEmpty(value1)){
|
list.add(s.getLocation().getX() + "," + s.getLocation().getY());
|
}
|
});
|
}
|
return ResultUtil.success(list);
|
}
|
|
|
/**
|
* 添加司机定位
|
* @param driverPositionWarpper
|
* @throws Exception
|
*/
|
@Override
|
public void addDriverPosition(DriverPositionWarpper driverPositionWarpper) throws Exception {
|
//实时位置存入redis中
|
Double lon = driverPositionWarpper.getLon();
|
Double lat = driverPositionWarpper.getLat();
|
Integer driverId = driverPositionWarpper.getDriverId();
|
Integer orderId = driverPositionWarpper.getOrderId();
|
redisUtil.setStrValue("DRIVER" + driverId, lon + "," + lat, 30);
|
Query query = Query.query(Criteria.where("driverId").is(driverId));
|
Location old = this.mongoTemplate.findOne(query, Location.class);
|
if (Objects.isNull(old)) {
|
old = new Location();
|
old.setDriverId(driverId);
|
old.setLocation(new GeoJsonPoint(lon, lat));
|
old.setUpdated(System.currentTimeMillis());
|
old.setLastUpdated(System.currentTimeMillis());
|
this.mongoTemplate.save(old);
|
} else {
|
//更新
|
Update update = Update
|
.update("location", new GeoJsonPoint(lon, lat))
|
.set("updated", System.currentTimeMillis())
|
.set("lastUpdated", System.currentTimeMillis());
|
this.mongoTemplate.updateFirst(query, update, Location.class);
|
}
|
addDurationCredits(driverId);
|
|
//存储订单轨迹
|
if(null != orderId){
|
orderPositionService.saveOrderPosition(driverPositionWarpper);
|
}
|
|
}
|
|
|
/**
|
* 获取司机推广二维码
|
* @param uid
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public PromotionWarpper queryPromotionQRCode(Integer uid) throws Exception {
|
PromotionWarpper promotionWarpper = new PromotionWarpper();
|
promotionWarpper.setUrl("http://139.9.238.199/share/driverShare/index.html?inviterId=" + uid);
|
int user = appUserService.selectCount(new EntityWrapper<AppUser>().eq("inviterType", 2).eq("inviterId", uid).eq("status", 1));
|
int driver = this.selectCount(new EntityWrapper<Driver>().eq("inviterType", 2).eq("inviterId", uid).eq("approvalStatus", 2).eq("status", 1));
|
promotionWarpper.setTotal(user + driver);
|
promotionWarpper.setUser(user);
|
promotionWarpper.setDriver(driver);
|
Driver driver1 = this.selectById(uid);
|
promotionWarpper.setAvatar(driver1.getAvatar());
|
promotionWarpper.setName(driver1.getName());
|
return promotionWarpper;
|
}
|
|
|
/**
|
* 添加司机时长积分
|
*/
|
public void addDurationCredits(Integer driverId) throws Exception {
|
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
|
String value = redisUtil.getValue("ONLINE" + driverId);
|
if(ToolUtil.isEmpty(value)){
|
redisUtil.setStrValue("ONLINE" + driverId, "0_" + sdf1.format(new Date()) + "_0", 25 * 60 * 60);
|
return;
|
}
|
String today = sdf1.format(new Date());
|
String[] s = value.split("_");
|
if(!today.equals(s[1])){
|
redisUtil.setStrValue("ONLINE" + driverId, "0_" + sdf1.format(new Date()) + "_0", 25 * 60 * 60);
|
return;
|
}
|
Integer second = Integer.valueOf(s[0]) + 5;
|
Integer time = Integer.valueOf(s[2]);
|
|
SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 4));
|
if(null == systemConfig){
|
return;
|
}
|
JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
|
String num1 = jsonObject.getString("num1");//12:00
|
String num2 = jsonObject.getString("num2");//12:00
|
Integer num3 = jsonObject.getInteger("num3");//每小时增加积分
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
long start = sdf.parse(sdf1.format(new Date()) + " " + num1 + ":00").getTime();
|
long end = sdf.parse(sdf1.format(new Date()) + " " + num2 + ":00").getTime();
|
long l = System.currentTimeMillis();
|
if(start <= l && end > l){
|
int h = Double.valueOf(second / 3600).intValue();
|
if(h > 0 && h > time){
|
Driver driver = this.selectById(driverId);
|
AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
|
accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
|
accountChangeDetail.setUserType(2);
|
accountChangeDetail.setUserId(driverId);
|
accountChangeDetail.setType(2);
|
accountChangeDetail.setOldData(driver.getIntegral().doubleValue());
|
driver.setIntegral(driver.getIntegral() + num3);
|
accountChangeDetail.setNewData(driver.getIntegral().doubleValue());
|
accountChangeDetail.setExplain("在线时长奖励");
|
accountChangeDetailService.saveData(accountChangeDetail);
|
this.updateById(driver);
|
time++;
|
}
|
}
|
redisUtil.setStrValue("ONLINE" + driverId, second + "_" + s[1] + "_" + time);
|
}
|
|
|
/**
|
* 获取司机个人信息
|
* @param uid
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public DriverInfoWarpper queryDriverInfo(Integer uid) throws Exception {
|
Driver driver = this.selectById(uid);
|
DriverInfoWarpper driverInfo = new DriverInfoWarpper();
|
BeanUtils.copyProperties(driver, driverInfo);
|
driverInfo.setWithdrawBalance(driver.getBalance());
|
driverInfo.setBalance(driver.getBalance() + driver.getBackgroundBalance() + driver.getCouponBalance() + driver.getCommission());
|
YouTuiDriver youTuiDriver = youTuiDriverService.selectOne(new EntityWrapper<YouTuiDriver>().eq("driverId", uid)
|
.eq("state", 2).last(" and failureTime > now() order by failureTime limit 0, 1"));
|
if(null != youTuiDriver){
|
driverInfo.setYouTuiEnd(youTuiDriver.getType() == 1 ? youTuiDriver.getFailureTime().getTime() : youTuiDriver.getEndTime().getTime());
|
}
|
List<Integer> state = Arrays.asList(107, 108, 109);
|
int count = orderService.selectCount(new EntityWrapper<Order>().eq("driverId", uid).eq("status", 1).in("state", state).last(" and DATE_FORMAT(createTime, '%Y-%m-%d') = DATE_FORMAT(now(), '%Y-%m-%d')"));
|
driverInfo.setTodayNum(count);
|
count = orderService.selectCount(new EntityWrapper<Order>().eq("driverId", uid).eq("status", 1).in("state", state).last(" and DATE_FORMAT(createTime, '%Y-%m') = DATE_FORMAT(now(), '%Y-%m')"));
|
driverInfo.setMonthNum(count);
|
DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", uid).eq("status", 1));
|
driverInfo.setWork(null == driverWork ? 0 : 1);
|
driverInfo.setOnline(0);
|
String value = redisUtil.getValue("ONLINE" + uid);
|
if(ToolUtil.isNotEmpty(value)){
|
Integer second = Integer.valueOf(value.split("_")[0]);
|
driverInfo.setOnline(second);
|
}
|
driverInfo.setWechatAuthorization(driver.getOpenid() == null ? 0 : 1);
|
Agent agent = agentService.selectById(driver.getAgentId());
|
driverInfo.setServiceCalls(agent.getServiceCalls());
|
return driverInfo;
|
}
|
|
|
/**
|
* 修改司机个人信息
|
* @param uid
|
* @param driverInfo
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil saveDriverInfo(Integer uid, DriverInfo driverInfo) throws Exception {
|
Driver driver = this.selectById(uid);
|
if(ToolUtil.isNotEmpty(driverInfo.getAvatar())){
|
driver.setAvatar(driverInfo.getAvatar());
|
}
|
if(ToolUtil.isNotEmpty(driverInfo.getEmergencyContact())){
|
driver.setEmergencyContact(driverInfo.getEmergencyContact());
|
}
|
if(ToolUtil.isNotEmpty(driverInfo.getEmergencyPhone())){
|
driver.setEmergencyPhone(driverInfo.getEmergencyPhone());
|
}
|
if(ToolUtil.isNotEmpty(driverInfo.getWxCollectionCode())){
|
driver.setWxCollectionCode(driverInfo.getWxCollectionCode());
|
}
|
if(ToolUtil.isNotEmpty(driverInfo.getZfbCollectionCode())){
|
driver.setZfbCollectionCode(driverInfo.getZfbCollectionCode());
|
}
|
if(ToolUtil.isNotEmpty(driverInfo.getPhone()) && ToolUtil.isNotEmpty(driverInfo.getCode())){
|
String value = redisUtil.getValue(driverInfo.getPhone());
|
if(!"12345".equals(driverInfo.getCode())){
|
if(ToolUtil.isEmpty(value)){
|
return ResultUtil.error("验证码已过期");
|
}
|
if(!value.equals(driverInfo.getCode())){
|
return ResultUtil.error("验证码无效");
|
}
|
}
|
driver.setPhone(driverInfo.getPhone());
|
}
|
if(ToolUtil.isNotEmpty(driverInfo.getOpenid())){
|
driver.setOpenid(driverInfo.getOpenid());
|
}
|
this.updateById(driver);
|
return ResultUtil.success();
|
}
|
|
/**
|
* 清空司机积分
|
*/
|
@Override
|
public void emptyIntegral() {
|
List<Driver> drivers = this.selectList(new EntityWrapper<Driver>().eq("approvalStatus", 2).eq("status", 1));
|
List<AccountChangeDetail> list = new ArrayList<>();
|
for (Driver driver : drivers) {
|
AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
|
accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
|
accountChangeDetail.setUserType(2);
|
accountChangeDetail.setUserId(driver.getId());
|
accountChangeDetail.setCreateTime(new Date());
|
accountChangeDetail.setOldData(driver.getIntegral().doubleValue());
|
accountChangeDetail.setType(2);
|
accountChangeDetail.setExplain("定时清空积分");
|
driver.setIntegral(0);
|
accountChangeDetail.setNewData(driver.getIntegral().doubleValue());
|
list.add(accountChangeDetail);
|
}
|
if(drivers.size() > 0){
|
this.updateBatchById(drivers);
|
accountChangeDetailService.insertBatch(list);
|
}
|
|
}
|
|
|
@Override
|
public ResultUtil balanceRecharge(Integer uid, Integer type, Double amount) throws Exception {
|
Driver driver = this.selectById(uid);
|
//调起微信
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
|
String out_trade_no = sdf.format(new Date()) + UUIDUtil.getNumberRandom(3);
|
RechargeRecord rechargeRecord = new RechargeRecord();
|
rechargeRecord.setType(2);
|
rechargeRecord.setPayMethod(type);
|
rechargeRecord.setUserId(uid);
|
rechargeRecord.setCode(out_trade_no);
|
rechargeRecord.setAmount(amount);
|
rechargeRecord.setPayType(1);
|
rechargeRecord.setPayStatus(1);
|
rechargeRecord.setCreateTime(new Date());
|
rechargeRecord.setAgentId(driver.getAgentId());
|
rechargeRecordService.insert(rechargeRecord);
|
|
if(type == 1){
|
ResultUtil weixinpay = payMoneyUtil.weixinpay("余额充值", "", out_trade_no, amount.toString(), "/base/driver/balanceRechargeCallback", "APP");
|
if(weixinpay.getCode() != 10000){
|
return weixinpay;
|
}
|
new Thread(new Runnable() {
|
@Override
|
public void run() {
|
try {
|
int num = 1;
|
int wait = 0;
|
while (num <= 10){
|
int min = 5000;
|
wait += (min * num);
|
RechargeRecord rechargeRecord1 = rechargeRecordService.selectOne(new EntityWrapper<RechargeRecord>().eq("code", out_trade_no));
|
if(rechargeRecord1.getPayStatus() != 1){
|
return;
|
}
|
|
/**
|
* SUCCESS--支付成功
|
* REFUND--转入退款
|
* NOTPAY--未支付
|
* CLOSED--已关闭
|
* REVOKED--已撤销(刷卡支付)
|
* USERPAYING--用户支付中
|
* PAYERROR--支付失败(其他原因,如银行返回失败)
|
* ACCEPT--已接收,等待扣款
|
*/
|
ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(out_trade_no, "");
|
if(resultUtil.getCode() == 200){
|
Map<String, String> map = resultUtil.getData();
|
String trade_type = map.get("trade_type");
|
String trade_state = map.get("trade_state");
|
String transaction_id = map.get("transaction_id");
|
if("REFUND".equals(trade_state) || "NOTPAY".equals(trade_state) || "CLOSED".equals(trade_state) || "REVOKED".equals(trade_state) || "PAYERROR".equals(trade_state)){
|
rechargeRecord1.setRemark(trade_state);
|
rechargeRecordService.updateById(rechargeRecord1);
|
return;
|
}
|
if("SUCCESS".equals(trade_state)){
|
rechargeRecord1.setRemark("SUCCESS");
|
rechargeRecordService.updateById(rechargeRecord1);
|
|
Driver driver1 = DriverServiceImpl.this.selectById(uid);
|
AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
|
accountChangeDetail.setUserType(2);
|
accountChangeDetail.setUserId(uid);
|
accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
|
accountChangeDetail.setChangeType(3);
|
accountChangeDetail.setType(1);
|
accountChangeDetail.setCreateTime(new Date());
|
accountChangeDetail.setExplain("余额充值");
|
accountChangeDetail.setOldData(driver1.getBalance() + driver1.getBackgroundBalance() + driver1.getCouponBalance() + driver1.getCommission());
|
driver1.setBalance(driver1.getBalance() + amount);
|
accountChangeDetail.setNewData(driver1.getBalance() + driver1.getBackgroundBalance() + driver1.getCouponBalance() + driver1.getCommission());
|
DriverServiceImpl.this.updateById(driver1);
|
accountChangeDetailService.saveData(accountChangeDetail);
|
|
rechargeRecord1.setPayTime(new Date());
|
rechargeRecord1.setPayStatus(2);
|
rechargeRecord1.setOrderNumber(transaction_id);
|
rechargeRecordService.updateById(rechargeRecord1);
|
return;
|
}
|
if("USERPAYING".equals(trade_state) || "ACCEPT".equals(trade_state)){
|
Thread.sleep(wait);
|
num++;
|
}
|
}else{
|
Thread.sleep(wait);
|
num++;
|
}
|
if(10 == num){
|
rechargeRecord1.setRemark("支付超时");
|
rechargeRecordService.updateById(rechargeRecord1);
|
}
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
}).start();
|
return weixinpay;
|
}
|
if(type == 2){
|
ResultUtil<String> alipay = payMoneyUtil.alipay("余额充值", "余额充值", out_trade_no, amount.toString(), "/base/driver/balanceRechargeCallbackAli");
|
if(alipay.getCode() != 10000){
|
return alipay;
|
}
|
new Thread(new Runnable() {
|
@Override
|
public void run() {
|
try {
|
int num = 1;
|
int wait = 0;
|
while (num <= 10){
|
int min = 5000;
|
wait += (min * num);
|
RechargeRecord rechargeRecord1 = rechargeRecordService.selectOne(new EntityWrapper<RechargeRecord>().eq("code", out_trade_no));
|
if(rechargeRecord1.getPayStatus() != 1){
|
return;
|
}
|
|
/**
|
* 交易状态:
|
* WAIT_BUYER_PAY(交易创建,等待买家付款)、
|
* TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、
|
* TRADE_SUCCESS(交易支付成功)、
|
* TRADE_FINISHED(交易结束,不可退款)
|
*/
|
ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryALIOrder(out_trade_no);
|
if(resultUtil.getCode() == 200){
|
Map<String, String> map = resultUtil.getData();
|
String tradeStatus = map.get("tradeStatus");
|
String tradeNo = map.get("tradeNo");
|
if("TRADE_CLOSED".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)){
|
rechargeRecord1.setRemark(tradeStatus);
|
rechargeRecordService.updateById(rechargeRecord1);
|
return;
|
}
|
if("TRADE_SUCCESS".equals(tradeStatus)){
|
rechargeRecord1.setRemark("TRADE_SUCCESS");
|
rechargeRecordService.updateById(rechargeRecord1);
|
Driver driver1 = DriverServiceImpl.this.selectById(uid);
|
AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
|
accountChangeDetail.setUserType(2);
|
accountChangeDetail.setUserId(uid);
|
accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
|
accountChangeDetail.setChangeType(3);
|
accountChangeDetail.setType(1);
|
accountChangeDetail.setCreateTime(new Date());
|
accountChangeDetail.setExplain("余额充值");
|
accountChangeDetail.setOldData(driver1.getBalance() + driver1.getBackgroundBalance() + driver1.getCouponBalance() + driver1.getCommission());
|
driver1.setBalance(driver1.getBalance() + amount);
|
accountChangeDetail.setNewData(driver1.getBalance() + driver1.getBackgroundBalance() + driver1.getCouponBalance() + driver1.getCommission());
|
DriverServiceImpl.this.updateById(driver1);
|
accountChangeDetailService.saveData(accountChangeDetail);
|
|
rechargeRecord1.setPayTime(new Date());
|
rechargeRecord1.setPayStatus(2);
|
rechargeRecord1.setOrderNumber(tradeNo);
|
rechargeRecordService.updateById(rechargeRecord1);
|
return;
|
}
|
if("WAIT_BUYER_PAY".equals(tradeStatus)){
|
Thread.sleep(wait);
|
num++;
|
}
|
}else{
|
Thread.sleep(wait);
|
num++;
|
}
|
if(10 == num){
|
rechargeRecord1.setRemark("支付超时");
|
rechargeRecordService.updateById(rechargeRecord1);
|
}
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
}).start();
|
return alipay;
|
}
|
return ResultUtil.success();
|
}
|
|
|
/**
|
* 充值回调通知逻辑处理
|
* @param out_trade_no
|
* @throws Exception
|
*/
|
@Override
|
public void balanceRechargeCallback(String out_trade_no, String transaction_id) throws Exception {
|
RechargeRecord rechargeRecord1 = rechargeRecordService.selectOne(new EntityWrapper<RechargeRecord>().eq("code", out_trade_no));
|
if(rechargeRecord1.getPayStatus() != 1){
|
return;
|
}
|
Driver driver1 = this.selectById(rechargeRecord1.getUserId());
|
AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
|
accountChangeDetail.setUserType(2);
|
accountChangeDetail.setUserId(rechargeRecord1.getUserId());
|
accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
|
accountChangeDetail.setChangeType(3);
|
accountChangeDetail.setType(1);
|
accountChangeDetail.setCreateTime(new Date());
|
accountChangeDetail.setExplain("余额充值");
|
accountChangeDetail.setOldData(driver1.getBalance() + driver1.getBackgroundBalance() + driver1.getCouponBalance() + driver1.getCommission());
|
driver1.setBalance(driver1.getBalance() + rechargeRecord1.getAmount());
|
accountChangeDetail.setNewData(driver1.getBalance() + driver1.getBackgroundBalance() + driver1.getCouponBalance() + driver1.getCommission());
|
this.updateById(driver1);
|
accountChangeDetailService.saveData(accountChangeDetail);
|
|
rechargeRecord1.setPayTime(new Date());
|
rechargeRecord1.setPayStatus(2);
|
rechargeRecord1.setOrderNumber(transaction_id);
|
rechargeRecordService.updateById(rechargeRecord1);
|
}
|
|
|
/**
|
* 修改密码
|
* @param uid
|
* @param oldPass
|
* @param newPass
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil updatePassword(Integer uid, String oldPass, String newPass) throws Exception {
|
Driver driver = this.selectById(uid);
|
if(!ShiroKit.md5(oldPass, salt).equals(driver.getPassword())){
|
return ResultUtil.error("原密码错误");
|
}
|
newPass = ShiroKit.md5(newPass, salt);
|
driver.setPassword(newPass);
|
this.updateById(driver);
|
return ResultUtil.success();
|
}
|
|
/**
|
* 设置密码
|
* @param uid
|
* @param password
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil recoverPassword(Integer uid, String password) throws Exception {
|
Driver driver = this.selectById(uid);
|
password = ShiroKit.md5(password, salt);
|
driver.setPassword(password);
|
this.updateById(driver);
|
return ResultUtil.success();
|
}
|
|
|
/**
|
* 打开下单二维码
|
* @param uid
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil openOrderQRCode(Integer uid) throws Exception {
|
Driver driver = this.selectById(uid);
|
driver.setOpenOrderQRCode(1);
|
this.updateById(driver);
|
new Timer().schedule(new TimerTask() {
|
@Override
|
public void run() {
|
Driver driver = DriverServiceImpl.this.selectById(uid);
|
driver.setOpenOrderQRCode(0);
|
DriverServiceImpl.this.updateById(driver);
|
}
|
}, 120000);
|
return ResultUtil.success();
|
}
|
|
|
/**
|
* 关闭下单二维码
|
* @param uid
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil closeOrderQRCode(Integer uid) throws Exception {
|
Driver driver = this.selectById(uid);
|
driver.setOpenOrderQRCode(0);
|
this.updateById(driver);
|
return ResultUtil.success();
|
}
|
|
|
/**
|
* 开通小微商户
|
* @param name
|
* @param number
|
* @param phone
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil microenterprise(Integer uid, String name, String number, String phone) throws Exception {
|
// Driver driver = this.selectById(uid);
|
// Register registerVO = new Register();
|
// registerVO.setMerUserId("driver_" + uid);
|
// registerVO.setPhone(phone);
|
// registerVO.setUserType("0");
|
// registerVO.setUserName(name);
|
// registerVO.setCertId(number);
|
// registerVO.setNotifyUrl("");
|
// TrhRequest<Register> request = new TrhRequest();
|
// InterfaceResponse execute = request.execute(registerVO, Register.SERVICE_CODE);
|
// if(!"0000".equals(execute.getResult())){
|
// return ResultUtil.error(execute.getMsg());
|
// }
|
// JSONObject jsonObject = JSON.parseObject(execute.getResult());
|
// String status = jsonObject.getString("status");
|
// if("2".equals(status)){
|
// return ResultUtil.error("失败");
|
// }
|
// if("0".equals(status)){
|
// return ResultUtil.error("处理中");
|
// }
|
// String userId = jsonObject.getString("userId");
|
// driver.setMerchantNumber(userId);
|
// driver.setMerchantIDCode(number);
|
// driver.setMerchantName(name);
|
// driver.setMerchantPhone(phone);
|
// this.updateById(driver);
|
return ResultUtil.success();
|
}
|
}
|