longz
2026-06-30 80fd77e1bcb47726e440b8a728838189cd39a56a
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml
@@ -13,6 +13,7 @@
        <result column="totalSeat" property="totalSeat"/>
        <result column="inserTime" property="inserTime"/>
        <result column="assignType" property="assignType"/>
        <result column="customerId" property="customerId"/>
    </resultMap>
@@ -26,7 +27,8 @@
        laveSeatNumber as laveSeatNumber,
        totalSeat as totalSeat,
        inserTime as inserTime,
        assignType as assignType
        assignType as assignType,
        customerId as customerId
        from t_line_shift_driver where 1 = 1
        <if test="null != driverId">
            and driverId = #{driverId}
@@ -35,7 +37,7 @@
            and lineShiftId = #{lineShiftId}
        </if>
        <if test="null != time">
            and DATE_FORMAT(`day`, '%Y-%m%-%d') = DATE_FORMAT(#{time}, '%Y-%m%-%d')
            and DATE_FORMAT(`day`, '%Y-%m-%d') = DATE_FORMAT(#{time}, '%Y-%m-%d')
        </if>
        order by `day`
    </select>
@@ -65,6 +67,7 @@
            -- 司机信息
            d.headImgUrl as headImgUrl,
            CONCAT(LEFT(d.name, 1), '师傅') as driverName,
            d.sex as sex,
            c.carLicensePlate as carLicensePlate,
            CONCAT(cb.name, cm.name) as carBrand,
            c.carColor as carColor,
@@ -74,7 +77,7 @@
            -- 线路信息
            l.id as lineId,
            l.name as lineName,
            lp.content as priceContent,
            null as priceContent,
            DATE_FORMAT(lsd.day, '%Y-%m-%d') as day,
            ls.startTime as startTime,
            ls.endTime as endTime,
@@ -112,7 +115,6 @@
            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>
@@ -143,49 +145,143 @@
        INNER JOIN t_line_shift ls ON l.id = ls.lineId AND ls.state = 1
        LEFT JOIN t_line_shift_driver lsd ON ls.id = lsd.lineShiftId
            AND lsd.driverId = #{driverId}
            AND DATE_FORMAT(lsd.`day`, '%Y-%m-%d') = #{date}
            AND lsd.`day` = #{date}
        WHERE dl.driverId = #{driverId}
          AND NOT EXISTS (
              SELECT 1
              FROM t_line_shift_driver done_lsd
              INNER JOIN t_order_cross_city occ ON occ.lineShiftDriverId = done_lsd.id
              WHERE done_lsd.driverId = #{driverId}
                AND done_lsd.lineShiftId = ls.id
                AND done_lsd.`day` = #{date}
                AND occ.isDelete = 1
                AND occ.state IN (6, 8, 9)
          )
        ORDER BY lineCompletedCount DESC, l.id, ls.startTime
    </select>
    <select id="countCompletedShiftOrders" resultType="int">
        SELECT COUNT(1)
        FROM t_line_shift_driver lsd
        INNER JOIN t_order_cross_city occ ON occ.lineShiftDriverId = lsd.id
        WHERE lsd.driverId = #{driverId}
          AND lsd.lineShiftId = #{lineShiftId}
          AND lsd.`day` = DATE(#{time})
          AND occ.isDelete = 1
          AND occ.state IN (6, 8, 9)
    </select>
    <!-- 【202604】查询司机本人已领取/被分配的排班列表(今天及之后) -->
    <select id="queryMyDriverShiftList" resultType="java.util.Map">
        SELECT
            lsd.id as lineShiftDriverId,
            lsd.lineShiftId as lineShiftId,
            lsd.laveSeat as laveSeat,
            lsd.totalSeat as totalSeat,
            ls.startTime as startTime,
            ls.endTime as endTime,
            l.name as lineName,
            IFNULL(lsd.assignType, 1) as assignType,
            occ.orderId as orderId,
            CASE WHEN occ.orderId IS NOT NULL THEN 3 ELSE NULL END as orderType,
            DATE_FORMAT(lsd.day, '%Y-%m-%d') as day
        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 (
            SELECT lineShiftDriverId, MIN(id) AS orderId
            FROM t_order_cross_city
            GROUP BY lineShiftDriverId
        ) occ ON occ.lineShiftDriverId = lsd.id
        WHERE lsd.driverId = #{driverId}
        <if test="startDate != null and startDate != ''">
          AND lsd.day = CAST(#{startDate} AS DATE)
        </if>
        <if test="startDate == null or startDate == ''">
          AND lsd.day &gt;= CURDATE()
        </if>
          AND ls.state = 1
          AND l.state = 1
        ORDER BY lsd.day ASC, ls.startTime ASC, lsd.id ASC
        SELECT *
        FROM (
            SELECT
                lsd.id as lineShiftDriverId,
                lsd.lineShiftId as lineShiftId,
                lsd.laveSeat as laveSeat,
                lsd.totalSeat as totalSeat,
                ls.startTime as startTime,
                ls.endTime as endTime,
                l.name as lineName,
                IFNULL(lsd.assignType, 1) as assignType,
                occ.orderId as orderId,
                CASE WHEN occ.orderId IS NOT NULL THEN 3 ELSE NULL END as orderType,
                DATE_FORMAT(lsd.day, '%Y-%m-%d') as day
            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 (
                SELECT lineShiftDriverId, MIN(id) AS orderId
                FROM t_order_cross_city
                WHERE isDelete = 1
                  AND state NOT IN (10, 12)
                GROUP BY lineShiftDriverId
            ) occ ON occ.lineShiftDriverId = lsd.id
            WHERE lsd.driverId = #{driverId}
              AND lsd.lineShiftId != -1
              AND NOT (
                  EXISTS (
                      SELECT 1
                      FROM t_order_cross_city occ_has
                      WHERE occ_has.lineShiftDriverId = lsd.id
                        AND occ_has.isDelete = 1
                        AND occ_has.state NOT IN (10, 12)
                  )
                  AND NOT EXISTS (
                  SELECT 1
                  FROM t_order_cross_city occ_end
                  WHERE occ_end.lineShiftDriverId = lsd.id
                    AND occ_end.isDelete = 1
                        AND occ_end.state NOT IN (8, 9, 10, 12)
                  )
              )
              <if test="startDate != null and startDate != ''">
                  AND lsd.day = #{startDate}
              </if>
              <if test="startDate == null or startDate == ''">
                  AND lsd.day &gt;= CURDATE()
              </if>
              AND ls.state = 1
              AND l.state = 1
            UNION ALL
            SELECT
                lsd.id as lineShiftDriverId,
                lsd.lineShiftId as lineShiftId,
                lsd.laveSeat as laveSeat,
                lsd.totalSeat as totalSeat,
                st.startTime as startTime,
                st.startTime as endTime,
                CONCAT(st.startCityName,'-',st.endCityName) as lineName,
                1 as assignType,
                NULL as orderId,
                NULL as orderType,
                DATE_FORMAT(lsd.day, '%Y-%m-%d') as day
            FROM t_line_shift_driver lsd
            INNER JOIN t_driver_self_trip st
                ON st.id = lsd.customerId
               AND st.state = 1
            WHERE lsd.driverId = #{driverId}
              AND lsd.lineShiftId = -1
              AND NOT (
                  EXISTS (
                      SELECT 1
                      FROM t_order_cross_city occ_has
                      WHERE occ_has.lineShiftDriverId = lsd.id
                        AND occ_has.isDelete = 1
                        AND occ_has.state NOT IN (10, 12)
                  )
                  AND NOT EXISTS (
                  SELECT 1
                  FROM t_order_cross_city occ_end
                  WHERE occ_end.lineShiftDriverId = lsd.id
                    AND occ_end.isDelete = 1
                        AND occ_end.state NOT IN (8, 9, 10, 12)
                  )
              )
              <if test="startDate != null and startDate != ''">
                  AND lsd.day = #{startDate}
              </if>
              <if test="startDate == null or startDate == ''">
                  AND lsd.day &gt;= CURDATE()
              </if>
        ) t
        ORDER BY t.day ASC, t.startTime ASC, t.lineShiftDriverId ASC
        LIMIT #{offset}, #{size}
    </select>
    <select id="queryCustomerIdByLineShiftDriverId" resultType="java.lang.Integer">
        select customerId
        from t_line_shift_driver
        where id = #{lineShiftDriverId}
        limit 1
    </select>
    <select id="queryOtherDriverShiftListWithShiftId" resultType="java.util.Map">
        SELECT
            other.id as lineShiftDriverId,
            other.driverId as driverId,
            d.headImgUrl as headImgUrl,
            d.name as driverName,
            c.carLicensePlate as carLicensePlate,
@@ -213,4 +309,102 @@
          AND ls.state = 1
        ORDER BY ls.startTime ASC, other.id ASC
    </select>
    <select id="queryAvailableCompanyDriversForShift" resultType="java.util.Map">
        SELECT
            0 - d.id as lineShiftDriverId,
            d.id as driverId,
            d.headImgUrl as headImgUrl,
            d.name as driverName,
            c.carLicensePlate as carLicensePlate,
            CONCAT(IFNULL(cb.name, ''), IFNULL(cm.name, '')) as carModel,
            IFNULL(c.carColor, '') as carColor,
            (IFNULL(cm.seat, 1) - 1) as laveSeat,
            (IFNULL(cm.seat, 1) - 1) as totalSeat,
            IFNULL((
                SELECT ROUND(AVG(oe.fraction), 2)
                FROM t_order_evaluate oe
                WHERE oe.driverId = d.id
            ), 0) as score,
            ls.startTime as startTime,
            2 as needConfirm
        FROM t_line_shift_driver cur
        INNER JOIN t_line_shift ls ON cur.lineShiftId = ls.id
        INNER JOIN t_order_cross_city occ ON occ.id = #{orderId}
        INNER JOIN t_driver currentDriver ON cur.driverId = currentDriver.id
        INNER JOIN t_driver d
            ON d.id != cur.driverId
            AND d.state = 2
            AND (
                (IFNULL(currentDriver.franchiseeId, 0) > 0 AND d.franchiseeId = currentDriver.franchiseeId)
                OR (IFNULL(currentDriver.franchiseeId, 0) = 0 AND d.companyId = currentDriver.companyId)
            )
        INNER 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
        WHERE cur.id = #{driverShiftId}
          AND cur.lineShiftId != -1
          AND ls.state = 1
          AND (IFNULL(cm.seat, 1) - 1) >= IFNULL(occ.peopleNumber, 1)
          AND NOT EXISTS (
              SELECT 1
              FROM t_line_shift_driver lsd2
              INNER JOIN t_line_shift ls2 ON lsd2.lineShiftId = ls2.id
              WHERE lsd2.driverId = d.id
                AND lsd2.lineShiftId != -1
                AND DATE(lsd2.day) = DATE(cur.day)
                AND lsd2.id != cur.id
                AND ls2.startTime &lt; ls.endTime
                AND ls2.endTime &gt; ls.startTime
          )
          AND NOT EXISTS (
              SELECT 1
              FROM t_order_cross_city occ2
              WHERE occ2.driverId = d.id
                AND occ2.isDelete = 1
                AND occ2.state IN (2, 3, 4, 5, 11)
                AND DATE(occ2.travelTime) = DATE(cur.day)
          )
          AND NOT EXISTS (
              SELECT 1
              FROM t_order_taxi ot
              WHERE ot.driverId = d.id
                AND ot.state IN (2, 3, 4, 5, 11)
                AND DATE(ot.travelTime) = DATE(cur.day)
          )
          AND NOT EXISTS (
              SELECT 1
              FROM t_order_private_car opc
              WHERE opc.driverId = d.id
                AND opc.state IN (2, 3, 4, 5, 11)
                AND DATE(opc.travelTime) = DATE(cur.day)
          )
        ORDER BY d.id ASC
    </select>
    <select id="queryExpiredNoOrderShiftIds" resultType="java.lang.Integer">
        SELECT lsd.id
        FROM t_line_shift_driver lsd
                 LEFT JOIN t_line_shift ls ON ls.id = lsd.lineShiftId
                 LEFT JOIN t_driver_self_trip st ON st.id = lsd.customerId
        WHERE lsd.day IS NOT NULL
          AND NOT EXISTS (
            SELECT 1
            FROM t_order_cross_city occ
            WHERE occ.lineShiftDriverId = lsd.id
              AND occ.isDelete = 1
              AND occ.state NOT IN (10, 12)
        )
          AND (
            (lsd.lineShiftId > 0
                AND ls.id IS NOT NULL
                AND ls.state = 1
                AND STR_TO_DATE(CONCAT(DATE_FORMAT(lsd.day, '%Y-%m-%d'), ' ', ls.endTime), '%Y-%m-%d %H:%i') &lt; NOW())
                OR
            (lsd.lineShiftId &lt;= -1
                AND st.id IS NOT NULL
                AND st.state = 1
                AND STR_TO_DATE(CONCAT(DATE_FORMAT(lsd.day, '%Y-%m-%d'), ' ', st.startTime), '%Y-%m-%d %H:%i') &lt; NOW())
            )
    </select>
</mapper>