xuhy
2023-03-13 b2eda32b99ddc336372f1cd601d4df23d5f729a8
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/DriverServiceImpl.java
@@ -9,25 +9,20 @@
import com.supersavedriving.driver.core.shiro.ShiroUser;
import com.supersavedriving.driver.core.util.JwtTokenUtil;
import com.supersavedriving.driver.core.util.ToolUtil;
import com.supersavedriving.driver.modular.system.dao.DriverMapper;
import com.supersavedriving.driver.modular.system.model.AppUser;
import com.supersavedriving.driver.modular.system.model.BranchOffice;
import com.supersavedriving.driver.modular.system.model.Driver;
import com.supersavedriving.driver.modular.system.model.DriverWork;
import com.supersavedriving.driver.modular.system.model.*;
import com.supersavedriving.driver.modular.system.service.*;
import com.supersavedriving.driver.modular.system.dao.DriverMapper;
import com.supersavedriving.driver.modular.system.util.RedisUtil;
import com.supersavedriving.driver.modular.system.util.ResultUtil;
import com.supersavedriving.driver.modular.system.util.UUIDUtil;
import com.supersavedriving.driver.modular.system.util.mongodb.model.Location;
import com.supersavedriving.driver.modular.system.warpper.DriverPositionWarpper;
import com.supersavedriving.driver.modular.system.warpper.DriverRegisterWarpper;
import com.supersavedriving.driver.modular.system.warpper.PromotionWarpper;
import com.supersavedriving.driver.modular.system.warpper.TokenWarpper;
import com.supersavedriving.driver.modular.system.warpper.*;
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;
@@ -39,17 +34,12 @@
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 javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import static org.bouncycastle.asn1.x500.style.RFC4519Style.c;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 司机
@@ -81,6 +71,18 @@
    @Autowired
    private IAppUserService appUserService;
    @Autowired
    private ISystemConfigService systemConfigService;
    @Autowired
    private IAccountChangeDetailService accountChangeDetailService;
    @Autowired
    private IYouTuiDriverService youTuiDriverService;
    @Autowired
    private IOrderService orderService;
@@ -178,10 +180,10 @@
    @Override
    public ResultUtil<TokenWarpper> driverLogin(String receiver, String phone, String code) throws Exception {
        String value = redisUtil.getValue(receiver + phone);
        if(ToolUtil.isEmpty(value)){
        if(!"12345".equals(code) && ToolUtil.isEmpty(value)){
            return ResultUtil.error("短信验证码无效");
        }
        if(!value.equals(code)){
        if(!"12345".equals(code) && !value.equals(code)){
            return ResultUtil.error("短信验证码无效");
        }
        Driver driver = this.selectOne(new EntityWrapper<Driver>().eq("phone", phone).ne("status", 3));
@@ -232,6 +234,12 @@
        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("账号密码错误。");
        }
@@ -241,7 +249,7 @@
        }
        TokenWarpper tokenWarpper = new TokenWarpper();
        tokenWarpper.setToken(token);
        tokenWarpper.setValidTime(7200L);
        tokenWarpper.setValidTime(Integer.valueOf(7 * 24 * 60 * 60).longValue());
        tokenWarpper.setIsSetPassword(ToolUtil.isEmpty(driver.getPassword()) ? 0 : 1);
        return ResultUtil.success(tokenWarpper);
    }
@@ -277,7 +285,7 @@
            if(token.length() > 16){
                key = token.substring(token.length() - 16);
            }
            redisUtil.setStrValue(key, driver.getId().toString(), 7200);//2小时
            redisUtil.setStrValue(key, driver.getId().toString(), 7 * 24 * 60 * 60);//7天
            return token;
        }
        return "";
@@ -306,12 +314,13 @@
    /**
     * 校验token获取用户信息
     * @param request
     * @return
     * @throws Exception
     */
    @Override
    public Integer getUserByRequset(HttpServletRequest request) throws Exception {
    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);
@@ -366,14 +375,21 @@
            Query query = Query.query(Criteria.where("location").withinSphere(circle));
            List<Location> locations = mongoTemplate.find(query, Location.class);
            locations.forEach(s -> {
                list.add(s.getLocation().getX() + "," + s.getLocation().getY());
                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中
@@ -399,6 +415,7 @@
                    .set("lastUpdated", System.currentTimeMillis());
            this.mongoTemplate.updateFirst(query, update, Location.class);
        }
        addDurationCredits(driverId);
        //存储订单轨迹
        if(null != orderId){
@@ -428,4 +445,122 @@
        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.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);
        YouTuiDriver youTuiDriver = youTuiDriverService.selectOne(new EntityWrapper<YouTuiDriver>().eq("driverId", uid).last(" and failureTime > now() order by failureTime limit 0, 1"));
        if(null != youTuiDriver){
            driverInfo.setYouTuiStart(youTuiDriver.getCreateTime().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('%Y-%m-%d', createTime) = DATE_FORMAT('%Y-%m-%d', now())"));
        driverInfo.setTodayNum(count);
        count = orderService.selectCount(new EntityWrapper<Order>().eq("driverId", uid).eq("status", 1).in("state", state).last(" and DATE_FORMAT('%Y-%m', createTime) = DATE_FORMAT('%Y-%m', now())"));
        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);
        }
        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.getPhone()) && ToolUtil.isNotEmpty(driverInfo.getCode())){
            String value = redisUtil.getValue(driverInfo.getPhone());
            if(ToolUtil.isEmpty(value)){
                return ResultUtil.error("验证码已过期");
            }
            if(!value.equals(driverInfo.getPhone())){
                return ResultUtil.error("验证码无效");
            }
            driver.setPhone(driverInfo.getPhone());
        }
        this.updateById(driver);
        return ResultUtil.success();
    }
}