Pu Zhibing
8 天以前 41d7465a87e2a52740936a5969c5b182e5eb09b3
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
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
package com.stylefeng.guns.modular.system.controller.checkCar;
 
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.stylefeng.guns.core.base.controller.BaseController;
import com.stylefeng.guns.core.base.tips.ErrorTip;
import com.stylefeng.guns.core.log.LogObjectHolder;
import com.stylefeng.guns.core.shiro.ShiroKit;
import org.springframework.data.redis.core.RedisTemplate;
import com.stylefeng.guns.modular.system.model.TAppUser;
import com.stylefeng.guns.modular.system.model.TOrderCheck;
import com.stylefeng.guns.modular.system.service.ITAppUserService;
import com.stylefeng.guns.modular.system.service.ITOrderCheckService;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.controller.util.ExcelUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
 
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
 
/**
 * 代检车订单管理控制器
 *
 * @author fengshuonan
 * @Date 2025-07-28 23:31:10
 */
@Controller
@RequestMapping("/tOrderCheck")
public class TOrderCheckController extends BaseController {
 
    private static final Logger log = LoggerFactory.getLogger(TOrderCheckController.class);
    private String PREFIX = "/system/tOrderCheck/";
 
    @Autowired
    private ITOrderCheckService tOrderCheckService;
 
    @Autowired
    private ITAppUserService tAppUserService;
 
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
 
    /**
     * 跳转到代检车订单管理首页
     */
    @RequestMapping("")
    public String index() {
        return PREFIX + "tOrderCheck.html";
    }
 
    /**
     * 跳转到添加代检车订单管理
     */
    @RequestMapping("/tOrderCheck_add")
    public String tOrderCheckAdd(Model model) {
        List<TAppUser> tAppUsers = tAppUserService.selectList(new EntityWrapper<TAppUser>().eq("status", 1).eq("is_exception", 1));
        model.addAttribute("tAppUsers", tAppUsers);
        return PREFIX + "tOrderCheck_add.html";
    }
 
    /**
     * 跳转到修改代检车订单管理
     */
    @RequestMapping("/tOrderCheck_update/{tOrderCheckId}")
    public String tOrderCheckUpdate(@PathVariable Integer tOrderCheckId, Model model) {
        TOrderCheck tOrderCheck = tOrderCheckService.selectById(tOrderCheckId);
        model.addAttribute("item",tOrderCheck);
        LogObjectHolder.me().set(tOrderCheck);
        return PREFIX + "tOrderCheck_edit.html";
    }
 
    /**
     * 跳转到订单详情页面
     */
    @RequestMapping("/tOrderCheck_detail/{tOrderCheckId}")
    public String tOrderCheckDetail(@PathVariable Integer tOrderCheckId, Model model) {
        TOrderCheck orderInfo = tOrderCheckService.getOrderInfo(tOrderCheckId);
        if (orderInfo == null) {
            // 如果订单不存在,返回错误页面或重定向
            return "redirect:" + PREFIX + "tOrderCheck.html";
        }
 
        // 格式化所有需要的时间字段并设置到orderInfo对象中
        java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
        if (orderInfo.getCreateTime() != null) {
            orderInfo.setCreateTimeFormat(dateFormat.format(orderInfo.getCreateTime()));
        }
        if (orderInfo.getReservationTime() != null) {
            orderInfo.setReservationTimeFormat(dateFormat.format(orderInfo.getReservationTime()));
        }
        if (orderInfo.getDispatchTime() != null) {
            orderInfo.setDispatchTimeFormat(dateFormat.format(orderInfo.getDispatchTime()));
        }
        if (orderInfo.getOrderTakingTime() != null) {
            orderInfo.setOrderTakingTimeFormat(dateFormat.format(orderInfo.getOrderTakingTime()));
        }
        if (orderInfo.getArrivalTimeAtTheAppointmentPoint() != null) {
            orderInfo.setArrivalTimeAtTheAppointmentPointFormat(dateFormat.format(orderInfo.getArrivalTimeAtTheAppointmentPoint()));
        }
        if (orderInfo.getStartTime() != null) {
            orderInfo.setStartTimeFormat(dateFormat.format(orderInfo.getStartTime()));
        }
        if (orderInfo.getEndTime() != null) {
            orderInfo.setEndTimeFormat(dateFormat.format(orderInfo.getEndTime()));
        }
        if (orderInfo.getGoTime() != null) {
            orderInfo.setGoTimeFormat(dateFormat.format(orderInfo.getGoTime()));
        }
        if (orderInfo.getSuccessTime() != null) {
            orderInfo.setSuccessTimeFormat(dateFormat.format(orderInfo.getSuccessTime()));
        }
        if (orderInfo.getPayTime() != null) {
            orderInfo.setPayTimeFormat(dateFormat.format(orderInfo.getPayTime()));
        }
        if (orderInfo.getCheckPayTime() != null) {
            orderInfo.setCheckPayTimeFormat(dateFormat.format(orderInfo.getCheckPayTime()));
        }
        if (orderInfo.getCommentTime() != null) {
            orderInfo.setCommentTimeFormat(dateFormat.format(orderInfo.getCommentTime()));
        }
 
        // 处理车检图片
        if (orderInfo.getCheckImg() != null && !orderInfo.getCheckImg().isEmpty()) {
            List<String> checkImgList = Arrays.stream(orderInfo.getCheckImg().split(","))
                    .map(String::trim)
                    .filter(s -> !s.isEmpty())
                    .collect(Collectors.toList());
            orderInfo.setCheckImgList(checkImgList);
        } else {
            orderInfo.setCheckImgList(Collections.emptyList());
        }
 
 
        // 将包含了所有格式化时间字段的orderInfo对象转换为JSON字符串
        String orderInfoStr = JSON.toJSONString(orderInfo);
        model.addAttribute("orderInfoStr", orderInfoStr);
        model.addAttribute("orderInfo", orderInfo);
        
        return PREFIX + "tOrderCheck_detail.html";
    }
 
    /**
     * 获取代检车订单管理列表
     */
    @RequestMapping(value = "/list")
    @ResponseBody
    public Object list(String createTime,
                       String code,
                       Integer source,
                       String userName,
                       String userPhone,
                       Integer state,
                       String driverName) {
        return super.packForBT(tOrderCheckService.getOrderCheckList(createTime, code, source, userName, userPhone, state, driverName));
    }
 
    /**
     * 删除代检车订单管理
     */
    @RequestMapping(value = "/delete")
    @ResponseBody
    public Object delete(@RequestParam Integer tOrderCheckId) {
        TOrderCheck tOrderCheck = new TOrderCheck();
        tOrderCheck.setId(tOrderCheckId);
        tOrderCheck.setStatus(3); // 设置状态为已删除
        tOrderCheckService.updateById(tOrderCheck);
        return SUCCESS_TIP;
    }
 
    /**
     * 修改代检车订单管理
     */
    @RequestMapping(value = "/update")
    @ResponseBody
    public Object update(TOrderCheck tOrderCheck) {
        tOrderCheckService.updateById(tOrderCheck);
        return SUCCESS_TIP;
    }
 
    /**
     * 代检车订单管理详情
     */
    @RequestMapping(value = "/detail/{tOrderCheckId}")
    @ResponseBody
    public Object detail(@PathVariable("tOrderCheckId") Integer tOrderCheckId) {
        return tOrderCheckService.selectById(tOrderCheckId);
    }
 
    /**
     * 关闭订单
     */
    @RequestMapping(value = "/cancel")
    @ResponseBody
    public Object cancel(@RequestParam Integer tOrderCheckId) {
        try {
            tOrderCheckService.cancel(tOrderCheckId);
            return SUCCESS_TIP;
        } catch (Exception e) {
            log.error("取消订单异常: ", e);
            return new ErrorTip(ResultUtil.ERROR, "服务器开小差啦");
        }
    }
    /**
     * 跳转到派单页面
     * 
     * @param tOrderCheckId 订单ID
     * @param type 派单类型:1=派单,2=改派
     * @param model 视图模型
     * @return 派单页面路径
     */
    @RequestMapping("/tOrderCheck_dispatch/{tOrderCheckId}/{type}")
    public String tOrderCheckDispatch(@PathVariable Integer tOrderCheckId, 
                                    @PathVariable Integer type, 
                                    Model model) {
        try {
            // 获取订单和用户信息
            TOrderCheck orderInfo = tOrderCheckService.getOrderInfo(tOrderCheckId);
            orderInfo.setReservationTimeFormat(DateUtil.format(orderInfo.getReservationTime(), DatePattern.NORM_DATETIME_PATTERN));
            model.addAttribute("orderId", tOrderCheckId);
            model.addAttribute("dispatchType", type);
            model.addAttribute("orderInfoData", orderInfo);
            return PREFIX + "tOrderCheck_dispatch.html";
        } catch (Exception e) {
            model.addAttribute("errorMsg", e.getMessage());
            return PREFIX + "tOrderCheck_dispatch.html";
        }
    }
    /**
     * 跳转到批量派单页面
     *
     * @param orderIds 订单ids
     * @param model 视图模型
     * @return 派单页面路径
     */
    @RequestMapping("/tOrderCheck_dispatchBatch")
    public String tOrderCheckDispatchBatch(String orderIds, Model model) {
        // 解析订单ID数组
        String[] orderIdArray = orderIds.split(",");
        List<Integer> orderIdList = Arrays.asList(orderIdArray).stream().map(Integer::valueOf).collect(Collectors.toList());
 
        // 查询选中的订单信息
        List<TOrderCheck> orderList = tOrderCheckService.getOrdersByIds(orderIdList);
 
        // 验证订单状态(确保都是可派单状态)
        List<TOrderCheck> validOrders = orderList.stream()
                .filter(item -> item.getState().equals(100))
                .peek(item->{
            item.setCreateTimeFormat(DateUtil.format(item.getCreateTime(), DatePattern.NORM_DATETIME_FORMAT));
            item.setReservationTimeFormat(DateUtil.format(item.getReservationTime(), DatePattern.NORM_DATETIME_FORMAT));
        }).collect(Collectors.toList());
 
        // 将订单信息传递给前端页面
        model.addAttribute("orderList", validOrders);
        model.addAttribute("orderIds", orderIds);
        return PREFIX + "tOrderCheck_dispatchBatch.html";
    }
    /**
     * 获取可派单司机分页列表(Ajax接口)
     */
    @RequestMapping(value = "/dispatchData")
    @ResponseBody
    public Object getDispatchDriverList(@RequestParam(required = false) Integer orderId,
                                        @RequestParam Integer dispatchType,
                                        @RequestParam(defaultValue = "") String keyword) {
        try {
            return super.packForBT(tOrderCheckService.getDispatchDriverList(orderId, dispatchType, keyword));
        } catch (Exception e) {
            log.error("派单操作异常: ", e);
            return new ErrorTip(ResultUtil.ERROR, "服务器开小差啦");
        }
    }
 
    /**
     * 执行派单/改派操作
     */
    @RequestMapping(value = "/executeDispatch")
    @ResponseBody
    public Object executeDispatch(@RequestParam Integer orderId,
                                @RequestParam Integer driverId,
                                @RequestParam Integer dispatchType) {
        try {
            tOrderCheckService.executeDispatch(orderId, driverId, dispatchType);
            return SUCCESS_TIP;
        } catch (Exception e) {
            log.error("派单操作异常: ", e);
            return new ErrorTip(ResultUtil.ERROR, "服务器开小差啦");
        }
    }
 
    /**
     * 执行批量派单操作
     */
    @RequestMapping(value = "/executeBatchDispatch")
    @ResponseBody
    public Object executeBatchDispatch(@RequestParam String orderIds,
                                     @RequestParam String driverIds) {
        try {
            // 解析订单ID数组
            List<Integer> orderIdList = Arrays.stream(orderIds.split(","))
                    .map(String::trim)
                    .map(Integer::parseInt)
                    .collect(Collectors.toList());
            
            // 解析司机ID数组
            List<Integer> driverIdList = Arrays.stream(driverIds.split(","))
                    .map(String::trim)
                    .map(Integer::parseInt)
                    .collect(Collectors.toList());
            
            // 验证订单数量和司机数量是否匹配
            if (orderIdList.size() != driverIdList.size()) {
                return new ErrorTip(ResultUtil.ERROR, "订单数量与司机数量不匹配");
            }
            
            // 执行批量派单
            tOrderCheckService.executeBatchDispatch(orderIdList, driverIdList);
            return SUCCESS_TIP;
        } catch (Exception e) {
            log.error("批量派单操作异常: ", e);
            return new ErrorTip(ResultUtil.ERROR, e.getMessage());
        }
    }
 
    /**
     * 新建订单
     */
    @RequestMapping(value = "/add")
    @ResponseBody
    public Object add(@RequestParam Integer userId,
                      @RequestParam String startAddress,
                      @RequestParam String endAddress,
                      @RequestParam String reservationTime) {
        try {
            tOrderCheckService.addOrder(userId, startAddress, endAddress, reservationTime);
            return SUCCESS_TIP;
        } catch (Exception e) {
            log.error("新建订单失败: {}", e.getMessage(), e);
            return new ErrorTip(ResultUtil.ERROR, "服务器开小差啦");
        }
    }
 
    /**
     * 导出车检订单列表
     */
    @RequestMapping(value = "/export")
    @ResponseBody
    public void export(HttpServletResponse response,
                      String createTime,
                      String code,
                      Integer source,
                      String userName,
                      String userPhone,
                      Integer state,
                      String driverName) throws IOException {
        try {
            // 获取导出数据
            List<TOrderCheck> exportData = tOrderCheckService.exportOrderCheckList(createTime, code, source, userName, userPhone, state, driverName);
            
            // 定义Excel表头
            String[] headers = {"下单时间", "订单编号", "订单来源", "预约时间", "下单用户昵称", 
                               "下单用户手机", "取车地", "还车地", "接单司机", "司机电话", "状态"};
            
            // 枚举值映射
            Map<Integer, String> stateMap = new HashMap<>();
            stateMap.put(100, "待派单");
            stateMap.put(101, "待接单");
            stateMap.put(102, "服务中");
            stateMap.put(104, "服务中");
            stateMap.put(105, "服务中");
            stateMap.put(106, "服务中");
            stateMap.put(107, "服务中");
            stateMap.put(108, "服务中");
            stateMap.put(109, "已完成");
            stateMap.put(110, "已完成");
            stateMap.put(111, "取消");
            
            Map<Integer, String> sourceMap = new HashMap<>();
            sourceMap.put(1, "小程序");
            sourceMap.put(2, "管理后台");
            
            // 时间格式化器
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            
            // 构建数据数组
            String[][] values = new String[exportData.size()][headers.length];
            for (int i = 0; i < exportData.size(); i++) {
                TOrderCheck order = exportData.get(i);
                values[i][0] = order.getCreateTime() != null ? dateFormat.format(order.getCreateTime()) : "";
                values[i][1] = order.getCode() != null ? order.getCode() : "";
                values[i][2] = sourceMap.getOrDefault(order.getSource(), "未知");
                values[i][3] = order.getReservationTime() != null ? dateFormat.format(order.getReservationTime()) : "";
                values[i][4] = order.getUserName() != null ? order.getUserName() : "";
                values[i][5] = order.getUserPhone() != null ? order.getUserPhone() : "";
                values[i][6] = order.getStartAddress() != null ? order.getStartAddress() : "";
                values[i][7] = order.getEndAddress() != null ? order.getEndAddress() : "";
                values[i][8] = order.getDriverName() != null ? order.getDriverName() : "";
                values[i][9] = order.getDriverPhone() != null ? order.getDriverPhone() : "";
                values[i][10] = stateMap.getOrDefault(order.getState(), "未知状态");
            }
            
            // 生成Excel文件名
            String fileName = "车检订单列表_" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".xls";
            
            // 生成Excel
            HSSFWorkbook workbook = ExcelUtil.getHSSFWorkbook("车检订单列表", headers, values, null);
            
            // 设置响应头
            ExcelUtil.setResponseHeader(response, URLEncoder.encode(fileName, "UTF-8"));
            
            // 输出文件
            workbook.write(response.getOutputStream());
            response.getOutputStream().flush();
            response.getOutputStream().close();
            
        } catch (Exception e) {
            log.error("导出车检订单列表失败: {}", e.getMessage(), e);
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            response.getWriter().write("导出失败: " + e.getMessage());
        }
    }
 
    /**
     * 检查代检车新订单通知
     */
    @RequestMapping(value = "/checkNewOrderNotification")
    @ResponseBody
    public Object checkNewOrderNotification() {
        try {
            // 获取当前用户信息
            Integer roleType = ShiroKit.getUser().getRoleType();
            Integer objectId = ShiroKit.getUser().getObjectId();
            
            Map<String, Object> result = new HashMap<>();
            List<String> orderIds = new ArrayList<>();
            
            String redisKey;
            if (roleType == 1) {
                // 平台用户 - 查看所有新订单
                redisKey = "newCheckCarOrder:platform";
            } else {
                // 分公司用户 - 只查看本分公司的新订单
                redisKey = "newCheckCarOrder:branch:" + objectId;
            }
            
            // 从Redis List获取新订单ID列表
            List<String> orderList = redisTemplate.opsForList().range(redisKey, 0, -1);
            if (orderList != null && !orderList.isEmpty()) {
                orderIds = orderList;
            }
            
            boolean hasNewOrder = !orderIds.isEmpty();
            int orderCount = orderIds.size();
            
            // 构建返回结果
            result.put("hasNewOrder", hasNewOrder);
            result.put("orderCount", orderCount);
            result.put("orderIds", orderIds);
            result.put("currentTime", DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMAT));
            
            // 如果有新订单,清空Redis中的记录(表示已经通知过了)
            if (hasNewOrder) {
                redisTemplate.delete(redisKey);
            }
            
            return result;
            
        } catch (Exception e) {
            log.error("检查代检车新订单通知失败: {}", e.getMessage(), e);
            Map<String, Object> errorResult = new HashMap<>();
            errorResult.put("hasNewOrder", false);
            errorResult.put("orderCount", 0);
            errorResult.put("orderIds", new ArrayList<>());
            errorResult.put("error", "检查通知失败");
            return errorResult;
        }
    }
}