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.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xiaopeng.api.dto.QueryOrderRouteDTO;
import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.dto.order.GetOrderNumDto;
import com.xiaopeng.api.dto.order.PopOrderDto;
import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO;
import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.order.XpTestOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.api.vo.order.*;
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.common.redis.service.RedisService;
import com.xiaopeng.order.mangodb.model.OrderTrajectory;
import com.xiaopeng.order.model.dto.XpOrderCommentDto;
import com.xiaopeng.order.model.dto.XpOrderOperateDTO;
import com.xiaopeng.order.model.dto.XpOrderPayDto;
import com.xiaopeng.order.model.dto.XpOrderReassignDTO;
import com.xiaopeng.order.model.exportExcel.XpOrderExportExcel;
import com.xiaopeng.order.model.query.XpHistoryOrderListQuery;
import com.xiaopeng.order.model.query.XpOrderExcelQuery;
import com.xiaopeng.order.model.query.XpOrderPageQuery;
import com.xiaopeng.order.model.query.XpTestOrderPageQuery;
import com.xiaopeng.order.model.vo.*;
import com.xiaopeng.order.service.IXpOrderService;
import com.xiaopeng.order.service.IXpTestOrderService;
import com.xiaopeng.order.vo.OrderDetailVo;
import com.xiaopeng.unifiedverification.interceptor.XpClientCheck;
import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*
* 订单 前端控制器
*
*
* @author mitao
* @since 2026-02-03
*/
@RestController
@Api(tags = "测试订单")
@RequiredArgsConstructor(onConstructor_ = @Lazy)
public class XpTestOrderController {
private final IXpTestOrderService xpTestOrderService;
private final XpVehicleClient xpVehicleClient;
/**
* 通过订单id查询订单信息
*
* @param orderId 订单id
* @return 订单详情
*/
@PostMapping("/inner/v1/testOrder/queryOrderById")
public R queryOrderById(@RequestParam Long orderId){
XpTestOrder xpTestOrder = xpTestOrderService.getById(orderId);
return R.ok(xpTestOrder);
}
/**
* 修改订单状态
* @param orderId
* @param status
* @return
*/
@PostMapping("/inner/v1/testOrder/updateOrderStatus")
public R updateOrderStatus(@RequestParam Long orderId,
@RequestParam Integer status){
xpTestOrderService.updateOrderStatus(orderId, status);
return R.ok();
}
/**
* 根据订单ID查询取消订单
*
* @param orderId
* @return
*/
@PostMapping("/inner/testOrder/cancelTestOrderById")
public R> cancelTestOrderById(@RequestParam Long orderId) {
return xpTestOrderService.cancelTestOrderById(orderId);
}
/**
* 生成订单
* @param query
* @return
*/
@ApiOperation(value = "生成订单", tags = {"管理后台-测试计划"})
@PostMapping("/api/v1/testOrder/addTestOrder")
public R> addTestOrder(@RequestBody AddTestOrderVo query){
xpTestOrderService.addTestOrder(query);
return R.ok();
}
/**
* 订单分页列表
*
* @param query 分页查询参数
* @return 分页结果
*/
@ApiOperation(value = "订单分页列表", tags = {"管理后台-测试计划"})
@PostMapping("/api/v1/testOrder/pageList")
public R> pageList(@Validated @RequestBody XpTestOrderPageQuery query) {
PageInfo pageInfo = xpTestOrderService.pageList(query);
return R.ok(pageInfo);
}
/**
* 订单详情
*
* @param id 订单ID
* @return 订单详情
*/
@ApiOperation(value = "订单详情", tags = {"管理后台-测试计划"})
@GetMapping("/api/v1/testOrder/queryById")
public R queryById(@ApiParam(value = "订单id", required = true) @RequestParam Long id) {
XpTestOrderDetailVO detail = xpTestOrderService.getOrderDetail(id);
return R.ok(detail);
}
/**
* 删除订单
*
* @param id 订单ID
* @return 操作结果
*/
@ApiOperation(value = "删除订单", tags = {"管理后台-测试计划"})
@DeleteMapping("/api/v1/testOrder/deleteById")
public R> deleteById(@ApiParam(value = "订单id", required = true) @RequestParam Long id) {
xpTestOrderService.deleteOrder(id);
return R.ok();
}
/**
* 取消/关闭订单
*
* @param dto 操作请求参数
* @return 操作结果
*/
@ApiOperation(value = "取消/关闭订单", tags = {"管理后台-测试计划"})
@PostMapping("/api/v1/testOrder/cancelAndCloseById")
public R> cancelAndCloseById(@Validated @RequestBody XpOrderOperateDTO dto) {
xpTestOrderService.cancelOrCloseOrder(dto.getOrderId(), dto.getType());
return R.ok();
}
/**
* 改派订单
*
* @param dto 改派请求参数
* @return 操作结果
*/
@ApiOperation(value = "改派订单", tags = {"管理后台-测试计划"}, notes = "车辆列表在vehicleConvoy服务")
@PostMapping("/api/v1/testOrder/reassignById")
public R> reassignById(@Validated @RequestBody XpOrderReassignDTO dto) {
xpTestOrderService.reassignOrder(
dto.getOrderId(),
dto.getVehicleId(),
dto.getReassignReason()
);
return R.ok();
}
@ApiOperation(value = "订单改价", tags = {"管理后台-测试计划"})
@PostMapping("/api/v1/testOrder/changeAmount")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "订单ID", required = true, dataType = "Long"),
@ApiImplicitParam(name = "amount", value = "新的订单金额", required = true, dataType = "BigDecimal")
})
public R> changeAmount(@RequestParam("id") Long id, @RequestParam("amount") BigDecimal amount) {
xpTestOrderService.changeAmount(id, amount);
return R.ok();
}
/**
* 订单车辆定位实时存储-订单车辆定位实时存储(内部接口)
*/
@PostMapping("/inner/v1/testOrder/saveVehicleLocation")
public R saveVehicleLocation(@RequestBody OrderTrajectoryVo vo) {
OrderTrajectory orderTrajectory = new OrderTrajectory();
BeanUtils.copyProperties(vo, orderTrajectory);
xpTestOrderService.saveVehicleLocation(orderTrajectory);
return R.ok();
}
/**
* 根据测试计划ID查询订单数量
* @param testPlanId
* @return
*/
@PostMapping("/inner/v1/testOrder/queryCountByTestPlanId")
public R queryCountByTestPlanId(@RequestParam Long testPlanId){
long count = xpTestOrderService.count(new QueryWrapper().eq("test_plan_id", testPlanId));
return R.ok(count);
}
}