Pu Zhibing
2026-01-12 3cd30ccaeab2161102ac1f68c44b04747c62cc03
Merge remote-tracking branch 'origin/dev' into dev
1个文件已添加
10个文件已修改
351 ■■■■■ 已修改文件
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/CrossCityShiftController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineShiftDriverServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/DriverShiftListWarpper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftDriverMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/ScanOrderDetailWarpper.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/CrossCityShiftController.java
@@ -1,9 +1,12 @@
package com.stylefeng.guns.modular.crossCity.controller;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.stylefeng.guns.modular.crossCity.server.ILineShiftDriverService;
import com.stylefeng.guns.modular.crossCity.warpper.DriverShiftListWarpper;
import com.stylefeng.guns.modular.system.service.IDriverService;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.util.SystemException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -15,6 +18,8 @@
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 【202601】城际专线排班控制器
@@ -49,6 +54,10 @@
            if (null == driverId) {
                return ResultUtil.tokenErr();
            }
            ResultUtil<DriverShiftListWarpper> driverShiftListWarpperResultUtil = validateDate(date);
            if (driverShiftListWarpperResultUtil.getCode().equals(ResultUtil.ERROR)) {
                return driverShiftListWarpperResultUtil;
            }
            DriverShiftListWarpper result = lineShiftDriverService.queryDriverShiftList(driverId, date);
            return ResultUtil.success(result);
        } catch (Exception e) {
@@ -56,4 +65,28 @@
            return ResultUtil.runErr();
        }
    }
    /**
     * 验证日期有效性
     * @param dateStr
     * @return
     */
    public ResultUtil<DriverShiftListWarpper> validateDate(String dateStr) {
        // 解析日期
        Date targetDate = DateUtil.parse(dateStr, "yyyy-MM-dd");
        Date today = DateUtil.beginOfDay(new Date());  // 今天 00:00:00
        // 1. 不能是今天之前的日期
        if (targetDate.before(today)) {
            return ResultUtil.error("日期不能早于今天");
        }
        // 2. 必须在7天内(包含今天,即今天 + 6天)
        long daysBetween = DateUtil.between(today, targetDate, DateUnit.DAY);
        if (daysBetween > 6) {  // 今天是第1天,所以差值最大为6
            return ResultUtil.error("只能查询7天内的排班信息");
        }
        return ResultUtil.success();
    }
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java
@@ -1,6 +1,10 @@
package com.stylefeng.guns.modular.crossCity.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.account.service.ITEnterpriseWithdrawalService;
@@ -32,10 +36,12 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.Map;
import java.util.UUID;
@Api
@@ -69,6 +75,12 @@
    @Value("${spring.profiles.active}")
    private String env;
    @Value("${filePath}")
    private String filePath;
    @Value("${qyt.admin_url}")
    private String adminUrl;
@@ -411,15 +423,18 @@
                return ResultUtil.error("生成小程序码失败");
            }
            // 5. 上传到OSS
            String qrCodeUrl = OssUploadUtil.ossUploadByStream(driverId, inputStream);
            if (ToolUtil.isEmpty(qrCodeUrl)) {
                return ResultUtil.error("上传小程序码失败");
            // 5. 上传到服务器
            File file = FileUtil.writeFromStream(inputStream, new File(filePath + "/" + UUID.randomUUID().toString() + ".png"));
            HttpRequest post = HttpUtil.createPost(adminUrl + "/upload/image");
            post.form("file", file);
            HttpResponse execute = post.execute();
            int status = execute.getStatus();
            if(200 != status){
                throw new RuntimeException("上传图片异常");
            }
            // 6. 返回结果
            BaseWarpper baseWarpper = new BaseWarpper();
            baseWarpper.setContent(qrCodeUrl);
            baseWarpper.setContent(execute.body());
            return ResultUtil.success(baseWarpper);
        } catch (Exception e) {
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineShiftDriverServiceImpl.java
@@ -1,5 +1,9 @@
package com.stylefeng.guns.modular.crossCity.server.impl;
import cn.hutool.core.date.DateUnit;
import cn.hutool.cron.CronUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.core.util.ToolUtil;
@@ -243,6 +247,16 @@
        DriverShiftListWarpper result = new DriverShiftListWarpper();
        // 获取司机的服务车型ID(跨城业务 type=3)
        Integer serverCarModelId = null;
        Integer carId = driverService.selectById(driverId).getCarId();
        if (carId != null) {
            CarService carServiceQuery = carServiceMapper.query(3, carId);
            if (carServiceQuery != null) {
                serverCarModelId = carServiceQuery.getServerCarModelId();
            }
        }
        // 查询司机在指定日期的排班信息
        List<Map<String, Object>> shiftList = lineShiftDriverMapper.queryDriverShiftByDate(driverId, date);
@@ -272,6 +286,22 @@
            DriverShiftListWarpper.LineItemWarpper lineItem = new DriverShiftListWarpper.LineItemWarpper();
            lineItem.setLineId(entry.getKey());
            lineItem.setLineName(lineNameMap.get(entry.getKey()));
            // 查询线路单价
            Double unitPrice = null;
            if (serverCarModelId != null) {
                Map<String, Object> priceInfo = linePriceMapper.query(entry.getKey(), serverCarModelId);
                if (priceInfo != null && priceInfo.get("content") != null) {
                    // 解析 content JSON,获取 num1(单人价格)
                    String content = priceInfo.get("content").toString();
                    JSONObject jsonObject = JSON.parseObject(content);
                    String num1 = jsonObject.getString("num1");
                    if (num1 != null && !num1.isEmpty()) {
                        unitPrice = Double.parseDouble(num1);
                    }
                }
            }
            lineItem.setUnitPrice(unitPrice);
            List<LineShiftItemWarpper> shifts = new ArrayList<>();
            for (Map<String, Object> shiftMap : entry.getValue()) {
@@ -304,7 +334,7 @@
                } else {
                    // 已预约可操作
                    shiftItem.setStatus(1);
                    shiftItem.setStatusText("预约");
                    shiftItem.setStatusText("已预约");
                    shiftItem.setCanOperate(true);
                }
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -1268,6 +1268,9 @@
        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("上车点信息不完整");
        }
@@ -1412,7 +1415,7 @@
        // 下单地点
        orderCrossCity.setPlacementLat(warpper.getPlacementLat());
        orderCrossCity.setPlacementLon(warpper.getPlacementLon());
        String placementAddress = warpper.getStartAddress();
        String placementAddress = warpper.getPlacementAddress();
        placementAddress = placementAddress.replaceAll("& #40;", "(");
        placementAddress = placementAddress.replaceAll("& #41;", ")");
        orderCrossCity.setPlacementAddress(placementAddress);
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/DriverShiftListWarpper.java
@@ -37,6 +37,8 @@
        private Integer lineId;
        @ApiModelProperty("线路名称")
        private String lineName;
        @ApiModelProperty("线路单价(单人价格)")
        private Double unitPrice;
        @ApiModelProperty("班次列表")
        private List<LineShiftItemWarpper> shifts;
@@ -56,6 +58,14 @@
            this.lineName = lineName;
        }
        public Double getUnitPrice() {
            return unitPrice;
        }
        public void setUnitPrice(Double unitPrice) {
            this.unitPrice = unitPrice;
        }
        public List<LineShiftItemWarpper> getShifts() {
            return shifts;
        }
@@ -69,6 +79,7 @@
            return "LineItemWarpper{" +
                    "lineId=" + lineId +
                    ", lineName='" + lineName + '\'' +
                    ", unitPrice=" + unitPrice +
                    ", shifts=" + shifts +
                    '}';
        }
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/controller/OrderCrossCityController.java
@@ -3,6 +3,7 @@
import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper;
import com.stylefeng.guns.modular.crossCity.warpper.ScanOrderDetailWarpper;
import com.stylefeng.guns.modular.system.service.IUserInfoService;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.util.SystemException;
@@ -151,4 +152,27 @@
    }
    /**
     * 【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) {
        try {
            return orderCrossCityService.queryScanOrderDetail(lineShiftDriverId, otherFee);
        } catch (Exception e) {
            e.printStackTrace();
            return ResultUtil.runErr();
        }
    }
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftDriverMapper.java
@@ -2,6 +2,16 @@
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver;
import org.apache.ibatis.annotations.Param;
import java.util.Map;
public interface LineShiftDriverMapper extends BaseMapper<LineShiftDriver> {
    /**
     * 【202601】根据司机排班记录ID查询扫码下单详情
     * @param lineShiftDriverId 司机排班记录ID
     * @return 扫码下单详情数据
     */
    Map<String, Object> queryScanOrderDetail(@Param("lineShiftDriverId") Integer lineShiftDriverId);
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml
@@ -13,4 +13,50 @@
        <result column="totalSeat" property="totalSeat"/>
        <result column="inserTime" property="inserTime"/>
    </resultMap>
    <!-- 【202601】根据司机排班记录ID查询扫码下单详情 -->
    <select id="queryScanOrderDetail" resultType="map">
        SELECT
            -- 司机信息
            d.headImgUrl as headImgUrl,
            CONCAT(LEFT(d.name, 1), '师傅') as driverName,
            c.carLicensePlate as carLicensePlate,
            CONCAT(cb.name, cm.name) as carBrand,
            c.carColor as carColor,
            (SELECT IFNULL(ROUND(AVG(fraction), 2), 0) FROM t_order_evaluate WHERE driverId = lsd.driverId) as score,
            (SELECT COUNT(*) FROM t_order_cross_city WHERE driverId = lsd.driverId AND state = 9) as orderCount,
            -- 线路信息
            l.id as lineId,
            l.name as lineName,
            lp.content as priceContent,
            DATE_FORMAT(lsd.day, '%Y-%m-%d') as day,
            ls.startTime as startTime,
            ls.endTime as endTime,
            lsd.totalSeat as totalSeat,
            lsd.laveSeat as laveSeat,
            lsd.laveSeatNumber as laveSeatNumber,
            -- 站点信息
            (SELECT siteId FROM t_line_site WHERE lineId = l.id AND type = 1 LIMIT 1) as startSiteId,
            (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 = 1 LIMIT 1) as startSiteName,
            (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,
            -- 其他信息
            cs.serverCarModelId as serverCarModelId,
            lsd.driverId as driverId,
            lsd.id as lineShiftDriverId
        FROM t_line_shift_driver lsd
        LEFT JOIN t_line_shift ls ON lsd.lineShiftId = ls.id
        LEFT JOIN t_line l ON ls.lineId = l.id
        LEFT JOIN t_driver d ON lsd.driverId = d.id
        LEFT JOIN t_car c ON d.carId = c.id
        LEFT JOIN t_car_brand cb ON c.carBrandId = cb.id
        LEFT JOIN t_car_model cm ON c.carModelId = cm.id
        LEFT JOIN t_car_service cs ON c.id = cs.carId AND cs.type = 3
        LEFT JOIN t_line_price lp ON l.id = lp.lineId AND cs.serverCarModelId = lp.serverCarModelId AND lp.state = 1
        WHERE lsd.id = #{lineShiftDriverId}
    </select>
</mapper>
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.service.IService;
import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
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;
@@ -331,4 +332,13 @@
    List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception;
    List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception;
    /**
     * 【202601】获取扫码下单详情
     * @param lineShiftDriverId 司机排班记录ID
     * @param otherFee 其他费用
     * @return 扫码下单详情
     * @throws Exception
     */
    ResultUtil<ScanOrderDetailWarpper> queryScanOrderDetail(Integer lineShiftDriverId, Double otherFee) throws Exception;
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -15,6 +15,7 @@
import com.stylefeng.guns.modular.crossCity.server.ILineService;
import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
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;
@@ -2976,4 +2977,66 @@
        }
        return maps;
    }
    /**
     * 【202601】获取扫码下单详情
     * @param lineShiftDriverId 司机排班记录ID
     * @param otherFee 其他费用
     * @return 扫码下单详情
     * @throws Exception
     */
    @Override
    public ResultUtil<ScanOrderDetailWarpper> queryScanOrderDetail(Integer lineShiftDriverId, Double otherFee) throws Exception {
        // 1. 查询基础数据
        Map<String, Object> data = lineShiftDriverMapper.queryScanOrderDetail(lineShiftDriverId);
        if (data == null || data.isEmpty()) {
            return ResultUtil.error("班次信息不存在");
        }
        // 2. 构建返回对象
        ScanOrderDetailWarpper result = new ScanOrderDetailWarpper();
        // 司机信息
        result.setHeadImgUrl(data.get("headImgUrl") != null ? data.get("headImgUrl").toString() : null);
        result.setDriverName(data.get("driverName") != null ? data.get("driverName").toString() : null);
        result.setCarLicensePlate(data.get("carLicensePlate") != null ? data.get("carLicensePlate").toString() : null);
        result.setCarBrand(data.get("carBrand") != null ? data.get("carBrand").toString() : null);
        result.setCarColor(data.get("carColor") != null ? data.get("carColor").toString() : null);
        result.setScore(data.get("score") != null ? Double.parseDouble(data.get("score").toString()) : 0.0);
        result.setOrderCount(data.get("orderCount") != null ? Integer.parseInt(data.get("orderCount").toString()) : 0);
        // 线路信息
        result.setLineId(data.get("lineId") != null ? Integer.parseInt(data.get("lineId").toString()) : null);
        result.setLineName(data.get("lineName") != null ? data.get("lineName").toString() : null);
        result.setDay(data.get("day") != null ? data.get("day").toString() : null);
        result.setStartTime(data.get("startTime") != null ? data.get("startTime").toString() : null);
        result.setEndTime(data.get("endTime") != null ? data.get("endTime").toString() : null);
        result.setTotalSeat(data.get("totalSeat") != null ? Integer.parseInt(data.get("totalSeat").toString()) : null);
        result.setLaveSeat(data.get("laveSeat") != null ? Integer.parseInt(data.get("laveSeat").toString()) : null);
        result.setLaveSeatNumber(data.get("laveSeatNumber") != null ? data.get("laveSeatNumber").toString() : null);
        // 3. 解析价格JSON获取单人价格
        String priceContent = data.get("priceContent") != null ? data.get("priceContent").toString() : null;
        if (priceContent != null && !priceContent.isEmpty()) {
            JSONObject json = JSON.parseObject(priceContent);
            String num1 = json.getString("num1");
            if (num1 != null && !num1.isEmpty()) {
                result.setUnitPrice(Double.parseDouble(num1));
            }
        }
        // 站点信息
        result.setStartSiteId(data.get("startSiteId") != null ? Integer.parseInt(data.get("startSiteId").toString()) : null);
        result.setStartSiteName(data.get("startSiteName") != null ? data.get("startSiteName").toString() : null);
        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.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);
    }
}
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/warpper/ScanOrderDetailWarpper.java
New file
@@ -0,0 +1,90 @@
package com.stylefeng.guns.modular.crossCity.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * 【202601】扫码下单详情包装类
 */
@Data
@ApiModel("扫码下单详情")
public class ScanOrderDetailWarpper {
    // ========== 司机信息 ==========
    @ApiModelProperty("司机头像")
    private String headImgUrl;
    @ApiModelProperty("司机名称(黄师傅格式)")
    private String driverName;
    @ApiModelProperty("车牌号")
    private String carLicensePlate;
    @ApiModelProperty("车辆类型(品牌+型号)")
    private String carBrand;
    @ApiModelProperty("车辆颜色")
    private String carColor;
    @ApiModelProperty("星级评分")
    private Double score;
    @ApiModelProperty("跨城订单单数")
    private Integer orderCount;
    // ========== 线路信息 ==========
    @ApiModelProperty("线路ID")
    private Integer lineId;
    @ApiModelProperty("线路名称")
    private String lineName;
    @ApiModelProperty("线路单价(单人价格)")
    private Double unitPrice;
    @ApiModelProperty("班次日期")
    private String day;
    @ApiModelProperty("班次开始时间")
    private String startTime;
    @ApiModelProperty("班次结束时间")
    private String endTime;
    @ApiModelProperty("总座位")
    private Integer totalSeat;
    @ApiModelProperty("剩余座位")
    private Integer laveSeat;
    @ApiModelProperty("剩余座位号(逗号分隔)")
    private String laveSeatNumber;
    // ========== 站点信息 ==========
    @ApiModelProperty("默认上车站点ID")
    private Integer startSiteId;
    @ApiModelProperty("默认上车站点名称")
    private String startSiteName;
    @ApiModelProperty("默认下车站点ID")
    private Integer endSiteId;
    @ApiModelProperty("默认下车站点名称")
    private String endSiteName;
    // ========== 其他信息 ==========
    @ApiModelProperty("其他费用")
    private Double otherFee;
    @ApiModelProperty("服务车型ID")
    private Integer serverCarModelId;
    @ApiModelProperty("司机ID")
    private Integer driverId;
    @ApiModelProperty("司机排班记录ID")
    private Integer lineShiftDriverId;
}