package com.xiaopeng.order.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; import com.xiaopeng.api.dto.order.AddCruiseMissionDto; import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient; import com.xiaopeng.api.model.order.XpCruiseOrder; import com.xiaopeng.api.vo.OrderType; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.utils.WebUtils; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.order.model.exportExcel.XpCruiseOrderExportExcel; import com.xiaopeng.order.model.exportExcel.XpOrderExportExcel; import com.xiaopeng.order.model.query.XpCruiseOrderExcelQuery; import com.xiaopeng.order.model.vo.XpOrderPageVO; import com.xiaopeng.order.service.IXpCruiseOrderService; import com.xiaopeng.order.model.query.XpCruiseOrderPageQuery; import com.xiaopeng.order.model.vo.XpCruiseOrderPageVO; import com.xiaopeng.order.service.IXpOrderService; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.context.annotation.Lazy; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.util.Arrays; import java.util.List; /** *

* 订单 前端控制器 *

* * @author mitao * @since 2026-02-03 */ @Validated @RestController @RequiredArgsConstructor(onConstructor_ = @Lazy) public class XpCruiseOrderController { private final IXpCruiseOrderService xpCruiseOrderService; private final OrderMissionClient orderMissionClient; private final IXpOrderService xpOrderService; /** * 根据车辆VIN码取消订单 * 发送取消订单XPU报文 * * @param */ @PostMapping("/inner/cruiseOrder/cancelCruiseOrderByVin") public R cancelCruiseOrderByVin(@RequestParam String vin) { Long id = xpCruiseOrderService.cancelCruiseOrderByVin(vin); return R.ok(id); } /** * 完成订单 * * @param */ @PostMapping("/inner/cruiseOrder/completeCruiseOrder") public R completeCruiseOrder(@RequestParam Long orderId) { xpCruiseOrderService.completeCruiseOrder(orderId); return R.ok(); } /** * 根据订单ID查询取消订单 * * @param orderId * @return */ @PostMapping("/inner/cruiseOrder/cancelCruiseOrderById") public R cancelCruiseOrderById(@RequestParam Long orderId) { return xpCruiseOrderService.cancelCruiseOrderById(orderId); } /** * 查询订单信息 * * @param orderId * @return */ @PostMapping("/inner/cruiseOrder/getCruiseOrder") public R getCruiseOrder(@RequestParam Long orderId) { return R.ok(xpCruiseOrderService.getById(orderId)); } /** * 新增订单 下发命令 * * @param * @return 订单ID */ @PostMapping("/inner/cruiseOrder/addCruiseOrder") public R addCruiseOrder(@RequestBody XpCruiseOrder order) { boolean save = xpCruiseOrderService.save(order); if (!save) { return R.fail("新增失败"); } // 下发命令 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setVin(order.getVehicleVin()); pushOrderDto.setOrderId("XU" + order.getId()); pushOrderDto.setStartLatitude(order.getStartLat()); pushOrderDto.setStartLongitude(order.getStartLon()); pushOrderDto.setEndLatitude(order.getEndLat()); pushOrderDto.setEndLongitude(order.getEndLon()); pushOrderDto.setOrderType(OrderType.CRUISE_ORDER); pushOrderDto.setStage(2); // 调用推送服务 orderId + carVin orderMissionClient.pushOrder(pushOrderDto); return R.ok(order.getId()); } /** * 巡游订单记录分页列表 * * @param query 分页查询参数 * @return 分页结果 */ @ApiOperation(value = "巡游订单记录分页列表", tags = {"管理后台-巡游订单"}) @PostMapping("/api/v1/cruise-order/pageList") public R> pageList(@Validated @RequestBody XpCruiseOrderPageQuery query) { PageInfo pageInfo = xpCruiseOrderService.pageList(query); return R.ok(pageInfo); } /** * 终止所有没结束或者终止的订单 * * @param vin * @return */ @PostMapping("/inner/cruiseOrder/stopAllCruiseOrder") public R stopAllCruiseOrder(@RequestParam String vin) { xpCruiseOrderService.update(new UpdateWrapper().eq("vehicleVin", vin) .in("status", Arrays.asList(0, 1)).set("status", 2)); return R.ok(); } /** * 巡游订单导出 * * @param query 查询参数 */ @ApiOperation(value = "巡游订单导出", tags = {"管理后台-巡游订单"}) @PostMapping("/api/v1/cruiseOrder/exportExcel") public void exportExcel(@RequestBody XpCruiseOrderExcelQuery query) { // 1. 查询导出数据 List dataList = xpCruiseOrderService.getExportList(query); // 2. 转换为导出对象 List exportList = BeanUtil.copyToList(dataList, XpCruiseOrderExportExcel.class); // 3. 生成 Excel Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpCruiseOrderExportExcel.class, exportList); // 4. 输出到响应流 HttpServletResponse response = WebUtils.response(); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); ServletOutputStream outputStream = null; try { String fileName = URLEncoder.encode("巡游订单订单列表.xls", "utf-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName); outputStream = response.getOutputStream(); workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } finally { try { if (outputStream != null) { outputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 删除巡游订单 * @param id * @return */ @ApiOperation(value = "删除巡游订单", tags = {"管理后台-巡游订单"}) @DeleteMapping(value = "/api/v1/cruise-order/deleteById/{id}") public R deleteById(@PathVariable Long id){ xpCruiseOrderService.removeById(id); return R.ok(); } @ApiOperation(value = "巡游订单详情", tags = {"管理后台-巡游订单"}) @GetMapping(value = "/api/v1/cruise-order/getDetailById/{id}") public R getDetailById(@PathVariable Long id){ XpCruiseOrderPageVO xpCruiseOrder = xpCruiseOrderService.getDetailById(id); return R.ok(xpCruiseOrder); } }