<?xml version="1.0" encoding="UTF-8"?>
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<mapper namespace="com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper">
|
|
<!-- 通用查询映射结果 -->
|
<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.crossCity.model.LineShiftDriver">
|
<id column="id" property="id"/>
|
<result column="lineShiftId" property="lineShiftId"/>
|
<result column="driverId" property="driverId"/>
|
<result column="day" property="day"/>
|
<result column="laveSeat" property="laveSeat"/>
|
<result column="laveSeatNumber" property="laveSeatNumber"/>
|
<result column="totalSeat" property="totalSeat"/>
|
<result column="inserTime" property="inserTime"/>
|
<result column="assignType" property="assignType"/>
|
<result column="customerId" property="customerId"/>
|
</resultMap>
|
|
|
<select id="queryByDriver" resultType="LineShiftDriver">
|
select
|
id as id,
|
lineShiftId as lineShiftId,
|
driverId as driverId,
|
`day` as `day`,
|
laveSeat as laveSeat,
|
laveSeatNumber as laveSeatNumber,
|
totalSeat as totalSeat,
|
inserTime as inserTime,
|
assignType as assignType,
|
customerId as customerId
|
from t_line_shift_driver where 1 = 1
|
<if test="null != driverId">
|
and driverId = #{driverId}
|
</if>
|
<if test="null != lineShiftId">
|
and lineShiftId = #{lineShiftId}
|
</if>
|
<if test="null != time">
|
and DATE_FORMAT(`day`, '%Y-%m-%d') = DATE_FORMAT(#{time}, '%Y-%m-%d')
|
</if>
|
order by `day`
|
</select>
|
|
<!-- 【202601】查询司机在指定日期的排班信息 -->
|
<select id="queryDriverShiftByDate" 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.id as lineId,
|
l.name as lineName
|
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
|
WHERE lsd.driverId = #{driverId}
|
AND DATE_FORMAT(lsd.`day`, '%Y-%m-%d') = #{date}
|
AND ls.state = 1
|
AND l.state = 1
|
ORDER BY l.id, ls.startTime
|
</select>
|
<select id="getDetail" resultType="java.util.Map">
|
SELECT
|
-- 司机信息
|
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,
|
(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,
|
null 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,
|
(SELECT s.city 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 startCityName,
|
(SELECT s.city 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 endCityName,
|
(SELECT s.lonLat 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 startLonLat,
|
(SELECT s.lonLat 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 endLonLat,
|
|
-- 默认点信息
|
(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 = 1 LIMIT 1) as startDefaultPointAddress,
|
(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 = 1 LIMIT 1) as startDefaultPointLon,
|
(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 = 1 LIMIT 1) as startDefaultPointLat,
|
(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 endDefaultPointAddress,
|
(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 endDefaultPointLon,
|
(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 endDefaultPointLat,
|
|
-- 其他信息
|
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
|
WHERE lsd.id = #{lineShiftDriverId}
|
</select>
|
|
<!-- 【202601】查询司机可预约的班次列表(包括已预约和未预约的) -->
|
<select id="queryDriverAvailableShifts" resultType="java.util.Map">
|
SELECT
|
ls.id as lineShiftId,
|
ls.lineId as lineId,
|
l.name as lineName,
|
ls.startTime as startTime,
|
ls.endTime as endTime,
|
ls.carNum as carNum,
|
lsd.id as lineShiftDriverId,
|
lsd.laveSeat as laveSeat,
|
lsd.totalSeat as totalSeat,
|
CASE WHEN lsd.id IS NOT NULL THEN 1 ELSE 0 END as isReserved,
|
-- 统计司机在该线路完成的订单次数(按lineShiftDriverId去重)
|
IFNULL((
|
SELECT COUNT(DISTINCT occ.lineShiftDriverId)
|
FROM t_order_cross_city occ
|
WHERE occ.driverId = #{driverId}
|
AND occ.lineId = l.id
|
AND occ.state IN(8,9)
|
AND occ.isDelete = 1
|
), 0) as lineCompletedCount
|
FROM t_driver_line dl
|
INNER JOIN t_line l ON dl.lineId = l.id AND l.state = 1
|
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 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 *
|
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 >= 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,
|
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
|
INNER JOIN t_driver_self_trip st
|
ON st.id = lsd.customerId
|
AND st.state = 1
|
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 >= 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,
|
CONCAT(IFNULL(cb.name, ''), IFNULL(cm.name, '')) as carModel,
|
IFNULL(c.carColor, '') as carColor,
|
other.laveSeat as laveSeat,
|
other.totalSeat as totalSeat,
|
IFNULL((
|
SELECT ROUND(AVG(oe.fraction), 2)
|
FROM t_order_evaluate oe
|
WHERE oe.driverId = other.driverId
|
), 0) as score,
|
ls.startTime as startTime
|
FROM t_line_shift_driver cur
|
INNER JOIN t_line_shift_driver other
|
ON other.lineShiftId = cur.lineShiftId
|
AND other.day = cur.day
|
AND other.id != cur.id
|
LEFT JOIN t_line_shift ls ON other.lineShiftId = ls.id
|
LEFT JOIN t_driver d ON other.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
|
WHERE cur.id = #{driverShiftId}
|
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 < ls.endTime
|
AND ls2.endTime > 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') < NOW())
|
OR
|
(lsd.lineShiftId <= -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') < NOW())
|
)
|
</select>
|
</mapper>
|