Pu Zhibing
2 天以前 9a66aa395b78b5df07058560eec181a66d6db2b9
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;
@@ -35,6 +37,7 @@
import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@@ -54,6 +57,8 @@
@Service
public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService {
    Logger logger = LoggerFactory.getLogger(OrderPrivateCarServiceImpl.class);
    @Resource
    private OrderPrivateCarMapper orderPrivateCarMapper;
@@ -153,6 +158,9 @@
    @Autowired
    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
    @Autowired
    private GeodesyUtil geodesyUtil;
    @Autowired
    private IOrderPositionService orderPositionService;
@@ -210,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;
@@ -224,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){
@@ -243,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;", ")");
@@ -287,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);
@@ -313,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)
@@ -339,20 +351,17 @@
        }
        // 查询预估价格
        ResultUtil<List<ServerCarModelWarpper>> listResultUtil = serverCarModelService.queryServerCarModel(startLon + "," + startLat, endLon + "," + endLat, 1);
        List<ServerCarModelWarpper> data = listResultUtil.getData();
        data = data.stream().filter(e -> serverCarModelId.equals(e.getId())).sorted(Comparator.comparing(ServerCarModelWarpper::getAmount)).collect(Collectors.toList());
        if(Objects.nonNull(openCity) && !CollectionUtils.isEmpty(data) && BigDecimal.valueOf(data.get(0).getAmount()).compareTo(openCity.getOrderMagnitude()) > 0){
        ResultUtil<ServerCarModelWarpper> listResultUtil = serverCarModelService.queryServerCarModel1(serverCarModelId, startLon + "," + startLat, endLon + "," + endLat, 1);
        if(200 != listResultUtil.getCode()){
            return ResultUtil.error(listResultUtil.getMsg());
        }
        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();
@@ -362,11 +371,7 @@
            baseWarpper.setAmount(orderPrivateCar.getOrderMoney());
            return ResultUtil.success(baseWarpper);
        }else {
            if(orderSource == 2){
                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);
@@ -382,7 +387,9 @@
                    }
                }).start();
            }
            long timeMillis2 = System.currentTimeMillis();
            logger.info("第二段用时:" + (timeMillis2 - timeMillis));
            timeMillis = timeMillis2;
            // TODO: 2021/5/11 修改,根据后台设定的派单范围查询范围内有无司机,将单子指派给距离最近的司机(距离相同随机取),范围内没有司机再进行推单流程
            if(orderPrivateCar.getState() == 1){
@@ -392,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 {
                        //获取空闲司机
@@ -433,11 +431,8 @@
                                        }
                                        String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId());
                                        if (null != value) {
//                                Map<String, String> distance1 = gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value, 0);//计算距离
//                                Integer d = Integer.valueOf(distance1.get("distance"));
                                            String[] split = value.split(",");
                                            double distance = GDMapGeocodingUtil.getDistance(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]));
                                            int d = Double.valueOf(distance).intValue();
                                            Map<String, Double> distance1 = geodesyUtil.getDistance(orderPrivateCar.getStartLat() + "," + orderPrivateCar.getStartLon(), value);
                                            int d = distance1.get("WGS84").intValue();
                                            if ((0 == m && null == driver) || (d < m)) {
                                                driver = drivers.get(j);
                                                m = d;
@@ -454,11 +449,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, String> distance = gdMapElectricFenceUtil.getDistance(startLon + "," + startLat, value, 1);
                                        int distance1 = Integer.parseInt(distance.get("distance"));
                                        if ((0 == m && null == dr) || (distance1 < m.intValue())) {
                                            dr = driver;
                                            m = d;
                                            m = distance1;
                                        }
                                    }
                                }
@@ -482,6 +477,7 @@
                                    dr.setState(3);
                                }
                                driverService.updateById(dr);
                                redisUtil.setStrValue("DRIVER_ORDER" + dr.getId(), orderPrivateCar.getId().toString(), 600);
                                new Thread(new Runnable() {
                                    @Override
                                    public void run() {
@@ -503,7 +499,9 @@
                    }
                }
            }
            long timeMillis3 = System.currentTimeMillis();
            logger.info("第三段用时:" + (timeMillis3 - timeMillis));
            timeMillis = timeMillis3;
            //推单操作
            if(orderPrivateCar.getState() == 1){
@@ -515,6 +513,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);
        }
    }
@@ -1030,18 +1031,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 {
@@ -1380,19 +1372,15 @@
    @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("系统繁忙,请稍后重试");
        }
        String key = orderId + "_during_payment";
        if(redisUtil.hasKey(key)){
            return ResultUtil.error("支付中,不能重复发起支付");
        }
        redisUtil.setStrValue(key, UUIDUtil.getRandomCode(), 10);
        try {
            OrderPrivateCar orderPrivateCar = this.selectById(orderId);
            if(orderPrivateCar.getState() == 8 || orderPrivateCar.getState() == 9){
@@ -1504,16 +1492,12 @@
                resultUtil = payMoneyUtil.weixinpay("完成订单",orderId +"", code,orderMoney+"","/base/wxPayOrderTaxi","JSAPI",userInfo.getAppletsOpenId());
                if(resultUtil.getCode()==200){
                    paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, null, 1, code);//添加预支付数据
                    long millis = System.currentTimeMillis();
                    new Thread(()->{
                        long time = millis;
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                        //订单创建后15分钟
                        while ((System.currentTimeMillis() - time) <= 900000) {
                        int num = 1;
                        int wait = 0;
                        while (num <= 13) {
                            int min = 5000;
                            wait += (min * num);
                            OrderPrivateCar orderPrivateCar1 = OrderPrivateCarServiceImpl.this.selectById(orderId);
                            if(orderPrivateCar1.getState() != 7){
                                break;
@@ -1543,12 +1527,17 @@
                                    if ("NOTPAY".equals(s) || "USERPAYING".equals(s)) {
                                    }
                                }
                                Thread.sleep(5000);
                            }catch (Exception e){
                                e.printStackTrace();
                            }finally {
                                try {
                                    Thread.sleep(wait);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                num++;
                            }
                        }
                        OrderPrivateCar orderPrivateCar1 = OrderPrivateCarServiceImpl.this.selectById(orderId);
                        if(7 == orderPrivateCar1.getState()){
                            //关闭订单,不允许支付
@@ -1898,21 +1887,10 @@
    @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){
@@ -1924,13 +1902,15 @@
                transactionDetailsService.saveData(orderPrivateCar.getUserId(), "完成订单", query.getAmount(), 2, 1, 1, 1, query.getOrderId());
//                orderPrivateCar.setState(8);
                orderPrivateCar.setPayType(type);
                orderPrivateCar.setTransactionId(order_id);
                if(!StringUtils.hasLength(orderPrivateCar.getTransactionId())){
                    orderPrivateCar.setTransactionId(order_id);
                }
                this.updateById(orderPrivateCar);
        
                UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
                SysIntegral query1 = sysIntegralMapper.query(orderPrivateCar.getCompanyId());
                userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
                userInfoService.updateById(userInfo);
//                UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
//                SysIntegral query1 = sysIntegralMapper.query(orderPrivateCar.getCompanyId());
//                userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
//                userInfoService.updateById(userInfo);
        
                //处理优惠券和红包
                if(null != orderPrivateCar.getCouponId()){