longz
2026-07-02 c788ca1640f080f821cb1cbe07da741302d355ef
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
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
<?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 &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,
                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 &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>
 
    <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>