“mitao”
2026-01-13 eb0fa100af9347ba2a93188170d023fe5cf396eb
feat(user):扫码下单创建订单接口
1个文件已添加
7个文件已修改
498 ■■■■■ 已修改文件
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Site.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java 318 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/OrderCrossCityScanWarpper.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/ScanOrderDetailWarpper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java
@@ -2,6 +2,7 @@
import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityScanWarpper;
import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper;
import com.stylefeng.guns.modular.crossCity.warpper.ScanOrderDetailWarpper;
import com.stylefeng.guns.modular.system.service.IUserInfoService;
@@ -155,24 +156,58 @@
    /**
     * 【202601】获取扫码下单详情
     * @param lineShiftDriverId 司机排班记录ID
     * @param otherFee 其他费用
     * @return 扫码下单详情
     */
    @ResponseBody
    @RequestMapping(value = "/api/orderCrossCity/queryScanOrderDetail", method = RequestMethod.POST)
    @ApiOperation(value = "【202601】获取扫码下单详情", tags = {"用户端-跨城"}, notes = "根据扫码内容获取下单页面详情数据,包含司机信息、线路信息、站点信息等")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "司机排班记录ID", name = "lineShiftDriverId", required = true, dataType = "int"),
            @ApiImplicitParam(value = "其他费用", name = "otherFee", required = false, dataType = "double")
    })
    public ResultUtil<ScanOrderDetailWarpper> queryScanOrderDetail(Integer lineShiftDriverId, Double otherFee) {
    @ApiImplicitParam(value = "司机排班记录ID", name = "lineShiftDriverId", required = true, dataType = "int")
    public ResultUtil<ScanOrderDetailWarpper> queryScanOrderDetail(Integer lineShiftDriverId, HttpServletRequest request) {
        try {
            return orderCrossCityService.queryScanOrderDetail(lineShiftDriverId, otherFee);
            Integer uid = userInfoService.getUserIdFormRedis(request);
            if(null == uid){
                return ResultUtil.tokenErr();
            }
            return orderCrossCityService.queryScanOrderDetail(lineShiftDriverId);
        } catch (Exception e) {
            e.printStackTrace();
            return ResultUtil.runErr();
        }
    }
    /**
     * 【202601】跨城出行扫码下单操作
     * <p>用户扫描司机二维码后进行下单,系统自动分配座位号</p>
     * <p>与普通下单的区别:仅支持拼车模式,座位自动分配,支持其他费用</p>
     *
     * @param orderCrossCityScanWarpper 扫码下单参数
     * @param request HTTP请求
     * @return 订单ID
     */
    @ResponseBody
    @RequestMapping(value = "/api/orderCrossCity/orderCrossCityScan", method = RequestMethod.POST)
    @ApiOperation(value = "【202601】跨城出行扫码下单操作", tags = {"用户端-跨城"}, notes = "用户扫描司机二维码下单,系统自动分配座位,仅支持拼车模式。返回订单ID后进行支付")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResultUtil<BaseWarpper> orderCrossCityScan(OrderCrossCityScanWarpper orderCrossCityScanWarpper, HttpServletRequest request){
        try {
            // XSS过滤地址信息
            String startAddress = orderCrossCityScanWarpper.getStartAddress();
            orderCrossCityScanWarpper.setStartAddress(cleanXSS(startAddress));
            orderCrossCityScanWarpper.setEndAddress(cleanXSS(orderCrossCityScanWarpper.getEndAddress()));
            // 获取用户ID
            Integer uid = userInfoService.getUserIdFormRedis(request);
            if(null == uid){
                return ResultUtil.tokenErr();
            }
            return orderCrossCityService.orderCrossCityScan(orderCrossCityScanWarpper, uid);
        } catch (SystemException se){
            return ResultUtil.error(se.getMessage());
        } catch (Exception e){
            e.printStackTrace();
            return ResultUtil.runErr();
        }
    }
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml
@@ -43,6 +43,11 @@
            (SELECT siteId FROM t_line_site WHERE lineId = l.id AND type = 2 LIMIT 1) as endSiteId,
            (SELECT s.name FROM t_site s JOIN t_line_site tls ON s.id = tls.siteId WHERE tls.lineId = l.id AND tls.type = 2 LIMIT 1) as endSiteName,
            -- 默认点信息(从起点站点获取)
            (SELECT s.defaultPointAddress FROM t_site s JOIN t_line_site tls ON s.id = tls.siteId WHERE tls.lineId = l.id AND tls.type = 2 LIMIT 1) as defaultPointAddress,
            (SELECT s.defaultPointLon FROM t_site s JOIN t_line_site tls ON s.id = tls.siteId WHERE tls.lineId = l.id AND tls.type = 2 LIMIT 1) as defaultPointLon,
            (SELECT s.defaultPointLat FROM t_site s JOIN t_line_site tls ON s.id = tls.siteId WHERE tls.lineId = l.id AND tls.type = 2 LIMIT 1) as defaultPointLat,
            -- 其他信息
            cs.serverCarModelId as serverCarModelId,
            lsd.driverId as driverId,
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java
@@ -426,6 +426,16 @@
    private Date payTime;
    private BigDecimal otherFee;
    public BigDecimal getOtherFee() {
        return otherFee;
    }
    public void setOtherFee(BigDecimal otherFee) {
        this.otherFee = otherFee;
    }
    public String getPromotionUser() {
        return promotionUser;
    }
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Site.java
@@ -68,6 +68,21 @@
     */
    @TableField("insertUserId")
    private Integer insertUserId;
    /**
     * 默认点位置
     */
    @TableField("defaultPointAddress")
    private String defaultPointAddress;
    /**
     * 默认点经度
     */
    @TableField("defaultPointLon")
    private Double defaultPointLon;
    /**
     * 默认点纬度
     */
    @TableField("defaultPointLat")
    private Double defaultPointLat;
    public Integer getId() {
        return id;
@@ -157,6 +172,30 @@
        this.insertUserId = insertUserId;
    }
    public String getDefaultPointAddress() {
        return defaultPointAddress;
    }
    public void setDefaultPointAddress(String defaultPointAddress) {
        this.defaultPointAddress = defaultPointAddress;
    }
    public Double getDefaultPointLon() {
        return defaultPointLon;
    }
    public void setDefaultPointLon(Double defaultPointLon) {
        this.defaultPointLon = defaultPointLon;
    }
    public Double getDefaultPointLat() {
        return defaultPointLat;
    }
    public void setDefaultPointLat(Double defaultPointLat) {
        this.defaultPointLat = defaultPointLat;
    }
    @Override
    public String toString() {
        return "Site{" +
@@ -171,6 +210,9 @@
                ", state=" + state +
                ", insertTime=" + insertTime +
                ", insertUserId=" + insertUserId +
                ", defaultPointAddress='" + defaultPointAddress + '\'' +
                ", defaultPointLon=" + defaultPointLon +
                ", defaultPointLat=" + defaultPointLat +
                '}';
    }
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java
@@ -2,9 +2,9 @@
import com.baomidou.mybatisplus.service.IService;
import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityScanWarpper;
import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper;
import com.stylefeng.guns.modular.crossCity.warpper.ScanOrderDetailWarpper;
import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
import com.stylefeng.guns.modular.system.model.vo.UnPayOrderVO;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
@@ -335,10 +335,18 @@
    /**
     * 【202601】获取扫码下单详情
     *
     * @param lineShiftDriverId 司机排班记录ID
     * @param otherFee 其他费用
     * @return 扫码下单详情
     * @throws Exception
     */
    ResultUtil<ScanOrderDetailWarpper> queryScanOrderDetail(Integer lineShiftDriverId, Double otherFee) throws Exception;
    ResultUtil<ScanOrderDetailWarpper> queryScanOrderDetail(Integer lineShiftDriverId) throws Exception;
    /**
     * 【202601】扫码下单操作
     * @param orderCrossCityWarpper
     * @param uid
     * @return
     */
    ResultUtil<BaseWarpper> orderCrossCityScan(OrderCrossCityScanWarpper orderCrossCityWarpper, Integer uid) throws Exception;
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -10,13 +10,16 @@
import com.stylefeng.guns.modular.crossCity.dao.LinePriceMapper;
import com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper;
import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper;
import com.stylefeng.guns.modular.crossCity.model.Line;
import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver;
import com.stylefeng.guns.modular.crossCity.model.LineSite;
import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
import com.stylefeng.guns.modular.crossCity.server.ILineService;
import com.stylefeng.guns.modular.crossCity.server.ILineSiteService;
import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityScanWarpper;
import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper;
import com.stylefeng.guns.modular.crossCity.warpper.ScanOrderDetailWarpper;
import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService;
import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper;
import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
@@ -196,6 +199,15 @@
    @Autowired
    private TDriverPromotionActivityService driverPromotionActivityService;
    @Autowired
    private CarServiceMapper carServiceMapper;
    @Autowired
    private ILineSiteService lineSiteService;
    @Autowired
    private ILineService lineService;
    
    
    @Value("${callbackPath}")
@@ -2980,13 +2992,13 @@
    /**
     * 【202601】获取扫码下单详情
     *
     * @param lineShiftDriverId 司机排班记录ID
     * @param otherFee 其他费用
     * @return 扫码下单详情
     * @throws Exception
     */
    @Override
    public ResultUtil<ScanOrderDetailWarpper> queryScanOrderDetail(Integer lineShiftDriverId, Double otherFee) throws Exception {
    public ResultUtil<ScanOrderDetailWarpper> queryScanOrderDetail(Integer lineShiftDriverId) throws Exception {
        // 1. 查询基础数据
        Map<String, Object> data = lineShiftDriverMapper.queryScanOrderDetail(lineShiftDriverId);
        if (data == null || data.isEmpty()) {
@@ -3031,12 +3043,310 @@
        result.setEndSiteId(data.get("endSiteId") != null ? Integer.parseInt(data.get("endSiteId").toString()) : null);
        result.setEndSiteName(data.get("endSiteName") != null ? data.get("endSiteName").toString() : null);
        // 默认点信息
        result.setDefaultPointAddress(data.get("defaultPointAddress") != null ? data.get("defaultPointAddress").toString() : null);
        result.setDefaultPointLon(data.get("defaultPointLon") != null ? Double.parseDouble(data.get("defaultPointLon").toString()) : null);
        result.setDefaultPointLat(data.get("defaultPointLat") != null ? Double.parseDouble(data.get("defaultPointLat").toString()) : null);
        // 其他信息
        result.setOtherFee(otherFee);
        result.setServerCarModelId(data.get("serverCarModelId") != null ? Integer.parseInt(data.get("serverCarModelId").toString()) : null);
        result.setDriverId(data.get("driverId") != null ? Integer.parseInt(data.get("driverId").toString()) : null);
        result.setLineShiftDriverId(lineShiftDriverId);
        return ResultUtil.success(result);
    }
    @Override
    public synchronized ResultUtil<BaseWarpper> orderCrossCityScan(OrderCrossCityScanWarpper warpper, Integer uid) throws Exception{
        // 1. 参数校验
        if (warpper.getLineShiftDriverId() == null) {
            return ResultUtil.error("班次ID不能为空");
        }
        if (warpper.getPeopleNumber() == null || warpper.getPeopleNumber() < 1 || warpper.getPeopleNumber() > 7) {
            return ResultUtil.error("乘车人数必须在1-7之间");
        }
        if (ToolUtil.isEmpty(warpper.getPassengersPhone())) {
            return ResultUtil.error("乘客手机号不能为空");
        }
        if (warpper.getPlacementLat() == null || warpper.getPlacementLon() == null || ToolUtil.isEmpty(warpper.getPlacementAddress())) {
            return ResultUtil.error("下单地点点信息不完整");
        }
        if (warpper.getStartLon() == null || warpper.getStartLat() == null || ToolUtil.isEmpty(warpper.getStartAddress())) {
            return ResultUtil.error("上车点信息不完整");
        }
        if (warpper.getEndLon() == null || warpper.getEndLat() == null || ToolUtil.isEmpty(warpper.getEndAddress())) {
            return ResultUtil.error("下车点信息不完整");
        }
        if (warpper.getOtherFee() != null && warpper.getOtherFee().compareTo(BigDecimal.ZERO) < 0) {
            return ResultUtil.error("其他费用不能为负数");
        }
        /**
         * 先判断司机座位数是否符合出行人数
         */
        LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(warpper.getLineShiftDriverId());
        if (lineShiftDriver.getLaveSeat() < warpper.getPeopleNumber()) {
            return ResultUtil.error("司机剩余座位数小于出行人数");
        }
        Driver driver = driverService.selectById(lineShiftDriver.getDriverId());
        if (driver == null) {
            return ResultUtil.error("司机信息不存在");
        }
        if (driver.getState() == 1) {
            return ResultUtil.error("司机处于离线状态");
        }
        // 4. 自动分配座位号
        String laveSeatNumber = lineShiftDriver.getLaveSeatNumber();
        if (ToolUtil.isEmpty(laveSeatNumber)) {
            return ResultUtil.error("无可用座位");
        }
        String[] availableSeats = laveSeatNumber.split(",");
        if (availableSeats.length < warpper.getPeopleNumber()) {
            return ResultUtil.error("座位不足,无法下单");
        }
        // 取前 peopleNumber 个座位
        StringBuilder seatNumberBuilder = new StringBuilder();
        for (int i = 0; i < warpper.getPeopleNumber(); i++) {
            if (i > 0) {
                seatNumberBuilder.append(",");
            }
            seatNumberBuilder.append(availableSeats[i]);
        }
        String seatNumber = seatNumberBuilder.toString();
        // 6. 获取线路班次信息
        LineSite lineSite = lineSiteService.selectById(lineShiftDriver.getLineShiftId());
        if (lineSite == null) {
            return ResultUtil.error("线路班次信息不存在");
        }
        Line line = lineService.selectById(lineSite.getLineId());
        if (line == null) {
            return ResultUtil.error("线路信息不存在");
        }
        /**
         * 1.出租车、专车、跨城有待支付的订单不能叫车
         * 2.小件物流有未完成的订单可以下跨城、专车、出租车
         * 3.出租车、专车、跨城有预约单可以下即时单
         */
        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12);
        if (orderPrivateCars.size() > 0) {
            return ResultUtil.error("有未完成的订单");
        }
        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12);
        if (list.size() > 0) {
            return ResultUtil.error("有未完成的订单");
        }
        List<OrderCrossCity> orderCrossCities1 = orderCrossCityMapper.queryByState(uid, 1, 2, 3, 4, 5, 6, 7, 11, 12);
        if (orderCrossCities1.size() > 0) {
            return ResultUtil.error("有未完成的订单");
        }
        List<OrderCrossCity> orderCrossCities2 = orderCrossCityMapper.queryOrders(driver.getId(), warpper.getLineShiftDriverId(), Arrays.asList(5));
        if (orderCrossCities2.size() > 0) {
            return ResultUtil.error("司机正在服务中");
        }
        // 10. 计算价格
        Map<String, String> distanceMap = gdMapElectricFenceUtil.getDistance(
                warpper.getStartLon() + "," + warpper.getStartLat(),
                warpper.getEndLon() + "," + warpper.getEndLat(), 1);
        if (distanceMap == null) {
            return ResultUtil.error("计算行程距离出错");
        }
        Double distance = Double.valueOf(distanceMap.get("distance"));
        // 获取车辆信息
        Car car = carMapper.selectById(driver.getCarId());
        if (car == null) {
            return ResultUtil.error("车辆信息不存在");
        }
        CarModel carModel = carModelMapper.selectById(car.getCarModelId());
        if (carModel == null) {
            return ResultUtil.error("车型信息不存在");
        }
        CarService carService = carServiceMapper.query(3, driver.getCarId());
        if(null == carService){
            return ResultUtil.error("车辆未开通该服务");
        }
        ResultUtil<Map<String, Object>> priceResult = this.getPrice(distance, warpper.getPeopleNumber(), 1,
                lineSite.getLineId(), carService.getServerCarModelId(), lineShiftDriver.getTotalSeat(), seatNumber);
        if (priceResult.getCode() != 200) {
            return ResultUtil.error("计算价格失败");
        }
        Double ticketPrice = Double.valueOf(priceResult.getData().get("price").toString());
        // 计算合计费用
        Double otherFee = warpper.getOtherFee() != null ? warpper.getOtherFee().setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() : 0D;
        Double totalMoney = new BigDecimal(ticketPrice).add(new BigDecimal(otherFee)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        UserInfo userInfo = userInfoService.selectById(uid);
        // 11. 创建订单
        OrderCrossCity orderCrossCity = new OrderCrossCity();
        orderCrossCity.setUserId(userInfo.getId());
        orderCrossCity.setPassengers(userInfo.getName());
        orderCrossCity.setPassengersPhone(warpper.getPassengersPhone());
        orderCrossCity.setServerCarModelId(carService.getServerCarModelId());
        orderCrossCity.setDriverId(driver.getId());
        orderCrossCity.setLineId(lineSite.getLineId());
        orderCrossCity.setCarId(driver.getCarId());
        orderCrossCity.setOrderNum(this.getOrderNum(driver.getId(), warpper.getLineShiftDriverId()));
        // 下单地点
        orderCrossCity.setPlacementLat(warpper.getPlacementLat());
        orderCrossCity.setPlacementLon(warpper.getPlacementLon());
        String placementAddress = warpper.getPlacementAddress();
        placementAddress = placementAddress.replaceAll("& #40;", "(");
        placementAddress = placementAddress.replaceAll("& #41;", ")");
        orderCrossCity.setPlacementAddress(placementAddress);
        // 上车点
        orderCrossCity.setStartLon(warpper.getStartLon());
        orderCrossCity.setStartLat(warpper.getStartLat());
        String startAddress = warpper.getStartAddress();
        startAddress = startAddress.replaceAll("& #40;", "(");
        startAddress = startAddress.replaceAll("& #41;", ")");
        orderCrossCity.setStartAddress(startAddress);
        // 下车点
        orderCrossCity.setEndLon(warpper.getEndLon());
        orderCrossCity.setEndLat(warpper.getEndLat());
        String endAddress = warpper.getEndAddress();
        endAddress = endAddress.replaceAll("& #40;", "(");
        endAddress = endAddress.replaceAll("& #41;", ")");
        orderCrossCity.setEndAddress(endAddress);
        orderCrossCity.setMileage(0D);
        orderCrossCity.setOrderMoney(totalMoney);
        orderCrossCity.setCompanyId(driver.getCompanyId());
        orderCrossCity.setPeopleNumber(warpper.getPeopleNumber());
        orderCrossCity.setSeatNumber(seatNumber);
        List<OrderCrossCity> orderCrossCities = this.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", orderCrossCity.getOrderNum()).eq("isDelete", 1));
        orderCrossCity.setSort(orderCrossCities.size() + 1);
        orderCrossCity.setState(7); // 待支付
        orderCrossCity.setInsertTime(new Date());
        // 设置出行时间为班次日期+开始时间
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(lineShiftDriver.getDay());
        String[] startTimeParts = lineSite.getStartTime().split(":");
        calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startTimeParts[0]));
        calendar.set(Calendar.MINUTE, Integer.parseInt(startTimeParts[1]));
        calendar.set(Calendar.SECOND, 0);
        orderCrossCity.setTravelTime(calendar.getTime());
        orderCrossCity.setSnatchOrderTime(new Date());
        orderCrossCity.setTravelMode(1); // 固定拼车
        orderCrossCity.setIsDelete(1);
        orderCrossCity.setIsReassign(1);
        orderCrossCity.setLineShiftDriverId(warpper.getLineShiftDriverId());
        orderCrossCity.setOrderSource(2); // 扫码下单
        orderCrossCity.setOtherFee(warpper.getOtherFee());
        // 推广订单处理
        Integer promotion = isPromotion(uid);
        if(promotion != null){
            orderCrossCity.setPromotion(2);
            Driver promotionDriver = driverService.selectById(promotion);
            orderCrossCity.setPromotionUser(promotionDriver.getName());
            orderCrossCity.setPromotionPhone(promotionDriver.getPhone());
            orderCrossCity.setPromotionDriverId(promotion);
        }else{
            orderCrossCity.setPromotion(1);
        }
        this.insert(orderCrossCity);
        // 13. 更新司机状态
        if (driver.getState() == 2) {
            driver.setState(3);
            driverService.updateById(driver);
        }
        // 14. 更新班次座位信息
        lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() - warpper.getPeopleNumber());
        // 更新剩余座位号
        StringBuilder newLaveSeatNumber = new StringBuilder();
        for (int i = warpper.getPeopleNumber(); i < availableSeats.length; i++) {
            if (newLaveSeatNumber.length() > 0) {
                newLaveSeatNumber.append(",");
            }
            newLaveSeatNumber.append(availableSeats[i]);
        }
        lineShiftDriver.setLaveSeatNumber(newLaveSeatNumber.toString());
        lineShiftDriverMapper.updateById(lineShiftDriver);
        // 15. 添加系统消息
        systemNoticeService.addSystemNotice(1, "您的跨城订单已下单成功,请尽快完成支付!", orderCrossCity.getUserId(), 1);
        // 16. 创建定时任务,30分钟未支付自动取消
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                OrderCrossCity orderCrossCity1 = orderCrossCityMapper.selectById(orderCrossCity.getId());
                if (orderCrossCity1.getState() == 7 && orderCrossCity1.getPayMoney() == null) {
                    orderCrossCity1.setState(10);
                    orderCrossCityMapper.updateById(orderCrossCity1);
                    //中台修改订单状态
                    if(ToolUtil.isNotEmpty(orderCrossCity1.getTravelId())){
                        ModifyTravelItineraryRequest request1 = new ModifyTravelItineraryRequest();
                        request1.setOrderId(orderCrossCity1.getTravelId());
                        request1.setStatus(orderCrossCity1.getState());
                        if (null != orderCrossCity1.getDriverId()) {
                            Driver driver2 = driverService.selectById(orderCrossCity1.getDriverId());
                            Company company = iCompanyService.selectById(driver2.getCompanyId());
                            request1.setDriverId(driver2.getEmpId().toString());
                            request1.setSupplierShopId(company.getEnterCode());
                        }
                        if (2 == orderCrossCity1.getPromotion() && null != orderCrossCity1.getPromotionDriverId()) {
                            Driver driver2 = driverService.selectById(orderCrossCity1.getPromotionDriverId());
                            request1.setPromoterId(driver2.getEmpId().toString());
                        }
                        OrderUtil.modifyTravelItinerary(request1);
                    }
                    //未支付的情况取消订单
                    if(null == orderCrossCity1.getPayType() && ToolUtil.isNotEmpty(orderCrossCity1.getTravelId())){
                        OrderUtil.tradeOrderCancel(orderCrossCity1.getTravelId());
                    }
                    OrderCancel orderCancel = new OrderCancel();
                    orderCancel.setOrderId(orderCrossCity1.getId());
                    orderCancel.setOrderType(3);
                    orderCancel.setReason("用户未及时付款,系统自动取消订单");
                    orderCancel.setRemark("用户未及时付款,系统自动取消订单");
                    orderCancel.setState(2);
                    orderCancel.setInsertTime(new Date());
                    orderCancel.setUserType(2);
                    orderCancelService.insert(orderCancel);
                    //修改司机座位
                    LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity1.getLineShiftDriverId());
                    lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity1.getPeopleNumber());
                    lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity1.getTravelMode() == 1 ? "," : "") + orderCrossCity1.getSeatNumber());
                    lineShiftDriverMapper.updateById(lineShiftDriver);
                    //修改司机为空闲
                    List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity1.getDriverId(), 2, 3, 4, 5, 11);
                    if (orderCrossCities.size() == 0) {
                        Driver driver = driverService.selectById(orderCrossCity1.getDriverId());
                        driver.setState(2);
                        driverService.updateById(driver);
                    }
                }
            }
        };
        Timer timer = new Timer();
        timer.schedule(timerTask, 30 * 60 * 1000);
        // 17. 返回结果
        BaseWarpper baseWarpper = new BaseWarpper();
        baseWarpper.setId(orderCrossCity.getId());
        return ResultUtil.success(baseWarpper);
    }
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/OrderCrossCityScanWarpper.java
New file
@@ -0,0 +1,51 @@
package com.stylefeng.guns.modular.crossCity.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel("跨城订单")
public class OrderCrossCityScanWarpper {
    @ApiModelProperty(value = "司机排班记录ID(班次ID)", required = true, dataType = "int")
    private Integer lineShiftDriverId;
    @ApiModelProperty(value = "乘车人数", required = true, dataType = "int")
    private Integer peopleNumber;
    @ApiModelProperty(value = "乘客手机号", required = true, dataType = "string")
    private String passengersPhone;
    @ApiModelProperty(value = "下单地点经度", required = true, dataType = "double")
    private Double placementLon;
    @ApiModelProperty(value = "下单地点纬度", required = true, dataType = "double")
    private Double placementLat;
    @ApiModelProperty(value = "下单详细地址", required = true, dataType = "string")
    private String placementAddress;
    @ApiModelProperty(value = "上车点经度", required = true, dataType = "double")
    private Double startLon;
    @ApiModelProperty(value = "上车点纬度", required = true, dataType = "double")
    private Double startLat;
    @ApiModelProperty(value = "上车点地址", required = true, dataType = "string")
    private String startAddress;
    @ApiModelProperty(value = "下车点经度", required = true, dataType = "double")
    private Double endLon;
    @ApiModelProperty(value = "下车点纬度", required = true, dataType = "double")
    private Double endLat;
    @ApiModelProperty(value = "下车点地址", required = true, dataType = "string")
    private String endAddress;
    @ApiModelProperty(value = "其他费用(远程费、高速费、等待费等),>=0,保留两位小数", required = false, dataType = "BigDecimal")
    private BigDecimal otherFee;
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/ScanOrderDetailWarpper.java
@@ -87,4 +87,13 @@
    @ApiModelProperty("司机排班记录ID")
    private Integer lineShiftDriverId;
    @ApiModelProperty("默认点位置")
    private String defaultPointAddress;
    @ApiModelProperty("默认点经度")
    private Double defaultPointLon;
    @ApiModelProperty("默认点纬度")
    private Double defaultPointLat;
}