longz
2026-04-29 b661c4ad2c636cf5b1dea720dc5a170341b9742a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
<?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,
            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,
            (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
            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>
 
    <!-- 【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 DATE_FORMAT(lsd.`day`, '%Y-%m-%d') = #{date}
        WHERE dl.driverId = #{driverId}
        ORDER BY lineCompletedCount DESC, l.id, ls.startTime
    </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 state != 10
                GROUP BY lineShiftDriverId
            ) occ ON occ.lineShiftDriverId = lsd.id
            WHERE lsd.driverId = #{driverId}
              AND lsd.lineShiftId != -1
              <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
              <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,
            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>
</mapper>