Pu Zhibing
2 天以前 1569ec5a8a0f8d2cccb1c18ce78658a3e358b2d8
UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -25,6 +25,8 @@
import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService;
import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
@@ -55,6 +57,8 @@
@Service
public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService {
    Logger logger = LoggerFactory.getLogger(OrderPrivateCarServiceImpl.class);
    @Resource
    private OrderPrivateCarMapper orderPrivateCarMapper;
@@ -154,6 +158,9 @@
    @Autowired
    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
    @Autowired
    private GeodesyUtil geodesyUtil;
    @Autowired
    private IOrderPositionService orderPositionService;
@@ -211,7 +218,7 @@
    public synchronized ResultUtil<BaseWarpper> saveOrderPrivateCar(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat, String startLon, String startLat,
                                          String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid,
                                                                    BigDecimal estimatedPrice,String cityCode,Integer carIndex) throws Exception {
        long timeMillis = System.currentTimeMillis();
        //如果出行时间大于当前10分钟则默认为预约单
        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
            reservation = 2;
@@ -225,10 +232,10 @@
        if(orderPrivateCars.size() > 0){
            return ResultUtil.error("有未完成的订单");
        }
        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11);
        if(list.size() > 0){
            return ResultUtil.error("有未完成的订单");
        }
//        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11);
//        if(list.size() > 0){
//            return ResultUtil.error("有未完成的订单");
//        }
        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 2, 1, 1, 2, 3, 4, 5, 6,  11);
        if(orderPrivateCars.size() > 0 && reservation == 2){
@@ -244,10 +251,10 @@
        }
        list = orderTaxiMapper.queryByState_(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
        if(list.size() > 0 && reservation == 2){
            return ResultUtil.error("有未完成的订单");
        }
//        list = orderTaxiMapper.queryByState_(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
//        if(list.size() > 0 && reservation == 2){
//            return ResultUtil.error("有未完成的订单");
//        }
        startAddress = startAddress.replaceAll("& #40;", "(");
        startAddress = startAddress.replaceAll("& #41;", ")");
@@ -288,24 +295,24 @@
        orderPrivateCar.setTravelTime(travelTime);
        orderPrivateCar.setOrderType(reservation);
        orderPrivateCar.setOrderSource(orderSource);
        Driver driver2 = driverService.selectById(driverId);
        if(orderSource == 2){//扫码下单
            Driver driver = driverService.selectById(driverId);
            if(null == driver){
            if(null == driver2){
                return ResultUtil.error("司机信息有误,无法完成下单");
            }
            if(driver.getAuthState() == 1){
            if(driver2.getAuthState() == 1){
                return ResultUtil.error("司机信息还未完成审核,无法完成下单");
            }
            if(driver.getAuthState() == 3){
            if(driver2.getAuthState() == 3){
                return ResultUtil.error("司机账户已被冻结,无法提供服务");
            }
            if(driver.getAuthState() == 4){
            if(driver2.getAuthState() == 4){
                return ResultUtil.error("司机信息未通过审核,无法提供服务");
            }
            if(driver.getState() == 1){
            if(driver2.getState() == 1){
                return ResultUtil.error("司机还未上线,无法提供服务");
            }
            if(driver.getState() == 3){
            if(driver2.getState() == 3){
                return ResultUtil.error("司机正在服务中,无法提供服务");
            }
            List<DriverService> query = driverServiceService.query(driverId, 1);
@@ -314,16 +321,20 @@
            }
            orderPrivateCar.setDriverId(driverId);
            orderPrivateCar.setCompanyId(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
                    driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
            orderPrivateCar.setCompanyId(driver2.getFranchiseeId() != null && driver2.getFranchiseeId() != 0 ? driver2.getFranchiseeId() : (
                    driver2.getCompanyId() != null && driver2.getCompanyId() != 0 ? driver2.getCompanyId() : 1));
            orderPrivateCar.setState(2);
            orderPrivateCar.setCarId(driver.getCarId());
            CarService query1 = carServiceMapper.query(1, driver.getCarId());
            orderPrivateCar.setCarId(driver2.getCarId());
            CarService query1 = carServiceMapper.query(1, driver2.getCarId());
            orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
            orderPrivateCar.setSnatchOrderTime(new Date());
            driver.setState(3);
            driverService.updateById(driver);
            driver2.setState(3);
            driverService.updateById(driver2);
            serverCarModelId = query1.getServerCarModelId();
        }
        long timeMillis1 = System.currentTimeMillis();
        logger.info("第一段用时:" + (timeMillis1 - timeMillis));
        timeMillis = timeMillis1;
        // 查询城市的订单额度
        OpenCity openCity = openCityService.selectOne(new EntityWrapper<OpenCity>()
                .eq("code", cityCode)
@@ -340,38 +351,17 @@
        }
        // 查询预估价格
        ResultUtil<List<ServerCarModelWarpper>> listResultUtil = serverCarModelService.queryServerCarModel(startLon + "," + startLat, endLon + "," + endLat, 1);
        List<ServerCarModelWarpper> data = listResultUtil.getData();
        System.out.println("预估价格++++++++++:"+data);
        System.out.println("服务车型id++++++++++:"+serverCarModelId);
        if(Objects.isNull(serverCarModelId)){
            // 查询司机
            Driver driver2 = driverService.selectById(driverId);
            //获取经营业务
            CarService query = new CarService();
            query.setCarId(driver2.getCarId());
            CarService service = carServiceMapper.selectOne(query);
            System.out.println("服务车型========:"+service);
            if(Objects.nonNull(service)){
                serverCarModelId = service.getServerCarModelId();
                System.out.println("服务车型id++++++++++:"+serverCarModelId);
            }
        ResultUtil<ServerCarModelWarpper> listResultUtil = serverCarModelService.queryServerCarModel1(serverCarModelId, startLon + "," + startLat, endLon + "," + endLat, 1);
        if(200 != listResultUtil.getCode()){
            return ResultUtil.error(listResultUtil.getMsg());
        }
        Integer finalServerCarModelId = serverCarModelId;
        System.out.println("服务车型id++++++++++:"+finalServerCarModelId);
        data = data.stream().filter(e -> finalServerCarModelId.equals(e.getId())).sorted(Comparator.comparing(ServerCarModelWarpper::getAmount)).collect(Collectors.toList());
        System.out.println("匹配出来的车型++++++++++:"+finalServerCarModelId);
        if(Objects.nonNull(openCity) && !CollectionUtils.isEmpty(data) && BigDecimal.valueOf(data.get(0).getAmount()).compareTo(openCity.getOrderMagnitude()) > 0){
        ServerCarModelWarpper data = listResultUtil.getData();
        if(Objects.nonNull(openCity) && BigDecimal.valueOf(data.getAmount()).compareTo(openCity.getOrderMagnitude()) > 0){
            orderPrivateCar.setIsReassign(1);
            orderPrivateCar.setIsDelete(1);
            orderPrivateCar.setState(7);
            if(orderSource == 2){
                orderPrivateCar.setOrderMoney(data.get(0).getAmount());
                orderPrivateCar.setEstimatedPrice(data.get(0).getAmount());
            }else {
                orderPrivateCar.setOrderMoney(data.get(carIndex).getAmount());
                orderPrivateCar.setEstimatedPrice(data.get(carIndex).getAmount());
            }
            orderPrivateCar.setOrderMoney(data.getAmount());
            orderPrivateCar.setEstimatedPrice(data.getAmount());
            orderPrivateCar.setPayMethod(0);
            this.insert(orderPrivateCar);
            BaseWarpper baseWarpper = new BaseWarpper();
@@ -381,13 +371,7 @@
            baseWarpper.setAmount(orderPrivateCar.getOrderMoney());
            return ResultUtil.success(baseWarpper);
        }else {
            if(orderSource == 2){
                if(!CollectionUtils.isEmpty(data)){
                    orderPrivateCar.setEstimatedPrice(data.get(0).getAmount());
                }
            }else {
                orderPrivateCar.setEstimatedPrice(data.get(carIndex).getAmount());
            }
            orderPrivateCar.setEstimatedPrice(data.getAmount());
            orderPrivateCar.setIsReassign(1);
            orderPrivateCar.setIsDelete(1);
            orderPrivateCar.setPayMethod(1);
@@ -403,7 +387,9 @@
                    }
                }).start();
            }
            long timeMillis2 = System.currentTimeMillis();
            logger.info("第二段用时:" + (timeMillis2 - timeMillis));
            timeMillis = timeMillis2;
            // TODO: 2021/5/11 修改,根据后台设定的派单范围查询范围内有无司机,将单子指派给距离最近的司机(距离相同随机取),范围内没有司机再进行推单流程
            if(orderPrivateCar.getState() == 1){
@@ -413,18 +399,9 @@
                }
                AssignOrder assignOrder = assignOrderService.selectOne(new EntityWrapper<AssignOrder>().eq("companyId", query.getId()).eq("type", 1));
                if(null != assignOrder){//配置了指派规则才处理
                    boolean lock = redisUtil.lock("order_lock", 10);
                    boolean lock = redisUtil.lock("order_lock", 10, 30);
                    if(!lock){
                        int num1 = 1;
                        while (num1 <= 10){
                            Thread.sleep(3000);//等待3秒
                            lock = redisUtil.lock("order_lock", 10);
                            if(lock){
                                break;
                            }else{
                                num1++;
                            }
                        }
                        return ResultUtil.error("系统繁忙,请稍后重试");
                    }
                    try {
                        //获取空闲司机
@@ -475,11 +452,11 @@
                                for (Driver driver : ds) {
                                    String value = redisUtil.getValue("DRIVER" + driver.getId());
                                    if (null != value) {
                                        Map<String, String> distance1 = gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value, 1);//计算距离
                                        Integer d = Integer.valueOf(distance1.get("distance"));
                                        if ((0 == m && null == dr) || (d.intValue() < m.intValue())) {
                                        Map<String, Double> distance = geodesyUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value);
                                        Double wgs84 = distance.get("WGS84");
                                        if ((0 == m && null == dr) || (wgs84.intValue() < m.intValue())) {
                                            dr = driver;
                                            m = d;
                                            m = wgs84.intValue();
                                        }
                                    }
                                }
@@ -524,7 +501,9 @@
                    }
                }
            }
            long timeMillis3 = System.currentTimeMillis();
            logger.info("第三段用时:" + (timeMillis3 - timeMillis));
            timeMillis = timeMillis3;
            //推单操作
            if(orderPrivateCar.getState() == 1){
@@ -536,6 +515,9 @@
            baseWarpper.setState(orderPrivateCar.getState());
            baseWarpper.setId(orderPrivateCar.getId());
            baseWarpper.setPayMethod(1);
            long timeMillis4 = System.currentTimeMillis();
            logger.info("第四段用时:" + (timeMillis4 - timeMillis));
            timeMillis = timeMillis4;
            return ResultUtil.success(baseWarpper);
        }
    }
@@ -1051,18 +1033,9 @@
     */
    @Override
    public ResultUtil cancleOrderPrivateCar(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception {
        boolean lock = redisUtil.lock(id + "_cancleOrder", 10);
        boolean lock = redisUtil.lock(id + "_cancleOrder", 10, 30);
        if(!lock){
            int num1 = 1;
            while (num1 <= 10){
                Thread.sleep(3000);//等待3秒
                lock = redisUtil.lock(id + "_cancleOrder", 10);
                if(lock){
                    break;
                }else{
                    num1++;
                }
            }
            return ResultUtil.error("系统繁忙,请稍后重试");
        }
        ResultUtil resultUtil = ResultUtil.success("");
        try {
@@ -1401,18 +1374,9 @@
    @Override
    public ResultUtil payPrivateCarOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception {
        boolean lock = redisUtil.lock(orderId + "_payment", 10);
        boolean lock = redisUtil.lock(orderId + "_payment", 10, 30);
        if(!lock){
            int num1 = 1;
            while (num1 <= 10){
                Thread.sleep(3000);//等待3秒
                lock = redisUtil.lock(orderId + "_payment", 10);
                if(lock){
                    break;
                }else{
                    num1++;
                }
            }
            return ResultUtil.error("系统繁忙,请稍后重试");
        }
        try {
            OrderPrivateCar orderPrivateCar = this.selectById(orderId);
@@ -1919,21 +1883,11 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public synchronized void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception {
        boolean lock = redisUtil.lock(order_id + "_paymentCallback", 10);
        boolean lock = redisUtil.lock(order_id + "_paymentCallback", 10, 30);
        if(!lock){
            int num1 = 1;
            while (num1 <= 10){
                Thread.sleep(3000);//等待3秒
                lock = redisUtil.lock(order_id + "_paymentCallback", 10);
                if(lock){
                    break;
                }else{
                    num1++;
                }
            }
            return;
        }
        try {
            PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), 1, type, null);
            if(null != query){