Day10 苍穹外卖项目 订单搜索、各个状态的订单统计、查询订单详细、接单、拒单、取消订单、派送订单、完成订单

目录

1.订单搜索

1.1 需求分析和设计

1.2 接口设计

1.2 代码实现

1.2.1 admin/OrderController

1.2.2 OrderService

1.2.3 OrderServiceImpl

1.3 功能测试

2.各个状态的订单数量统计

2.1 需求分析和设计

2.2 接口设计

2.3 代码实现

2.3.1 admin/OrderController

2.3.2 OrderService

2.3.3 OrderServiceImpl

2.3.4 OrderMapper

2.4 功能测试

3.查询订单详情

3.1 需求分析和设计

3.2 接口设计

3.3 代码实现

3.3.1 admin/OrderController

3.4 功能测试

4.接单

4.1 需求分析和设计

4.2 接口设计

4.3 代码实现

4.3.1 admin/OrderController

4.3.2 OrderService

4.3.3 OrderServiceImpl

4.4 功能测试

5.拒单

5.1 需求分析和设计

5.2 接口设计

5.3 代码实现

5.3.1 admin/OrderController

5.3.2 OrderService

5.3.3 OrderServiceImpl

5.4 功能测试

6.取消订单

6.1 需求分析和设计

6.2 接口设计

6.3 代码实现

6.3.1 admin/OrderController

6.3.2 OrderService

6.3.3 OrderServiceImpl

6.4 功能测试

7.派送订单

7.1 需求分析和设计

7.2 接口设计

7.3 代码实现

7.3.1 admin/OrderController

7.3.2 OrderService

7.3.3 OrderServiceImpl

7.4 功能测试

8.完成订单

8.1 需求分析和设计

8.2 接口设计

8.3 代码实现

8.3.1 admin/OrderController

8.3.2 OrderService

8.3.3 OrderServiceImpl

8.4 功能测试


1.订单搜索

1.1 需求分析和设计

产品原型:

业务规则:

  • 输入订单号/手机号进行搜索,支持模糊搜索

  • 根据订单状态进行筛选

  • 下单时间进行时间筛选

  • 搜索内容为空,提示未找到相关订单

  • 搜索结果页,展示包含搜索关键词的内容

  • 分页展示搜索到的订单数据

1.2 接口设计

 

1.2 代码实现

1.2.1 admin/OrderController

在admin包下创建OrderController

/**
 * 订单管理
 */
@RestController("adminOrderController")
@RequestMapping("/admin/order")
@Slf4j
@Api(tags = "订单管理接口")
public class OrderController {

    @Autowired
    private OrderService orderService;

    /**
     * 订单搜索
     *
     * @param ordersPageQueryDTO
     * @return
     */
    @GetMapping("/conditionSearch")
    @ApiOperation("订单搜索")
    public Result<PageResult> conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO) {
        PageResult pageResult = orderService.conditionSearch(ordersPageQueryDTO);
        return Result.success(pageResult);
    }
}

1.2.2 OrderService

    /**
     * 条件搜索订单
     * @param ordersPageQueryDTO
     * @return
     */
    PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO);

1.2.3 OrderServiceImpl

    /**
     * 订单搜索
     *
     * @param ordersPageQueryDTO
     * @return
     */
    public PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO) {
        PageHelper.startPage(ordersPageQueryDTO.getPage(), ordersPageQueryDTO.getPageSize());

        Page<Orders> page = orderMapper.pageQuery(ordersPageQueryDTO);

        // 部分订单状态,需要额外返回订单菜品信息,将Orders转化为OrderVO
        List<OrderVO> orderVOList = getOrderVOList(page);

        return new PageResult(page.getTotal(), orderVOList);
    }

    private List<OrderVO> getOrderVOList(Page<Orders> page) {
        // 需要返回订单菜品信息,自定义OrderVO响应结果
        List<OrderVO> orderVOList = new ArrayList<>();

        List<Orders> ordersList = page.getResult();
        if (!CollectionUtils.isEmpty(ordersList)) {
            for (Orders orders : ordersList) {
                // 将共同字段复制到OrderVO
                OrderVO orderVO = new OrderVO();
                BeanUtils.copyProperties(orders, orderVO);
                String orderDishes = getOrderDishesStr(orders);

                // 将订单菜品信息封装到orderVO中,并添加到orderVOList
                orderVO.setOrderDishes(orderDishes);
                orderVOList.add(orderVO);
            }
        }
        return orderVOList;
    }

    /**
     * 根据订单id获取菜品信息字符串
     *
     * @param orders
     * @return
     */
    private String getOrderDishesStr(Orders orders) {
        // 查询订单菜品详情信息(订单中的菜品和数量)
        List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(orders.getId());

        // 将每一条订单菜品信息拼接为字符串(格式:宫保鸡丁*3;)
        List<String> orderDishList = orderDetailList.stream().map(x -> {
            String orderDish = x.getName() + "*" + x.getNumber() + ";";
            return orderDish;
        }).collect(Collectors.toList());

        // 将该订单对应的所有菜品信息拼接在一起
        return String.join("", orderDishList);
    }

1.3 功能测试

2.各个状态的订单数量统计

2.1 需求分析和设计

产品原型:

2.2 接口设计

2.3 代码实现

2.3.1 admin/OrderController

    /**
     * 各个状态的订单数量统计
     *
     * @return
     */
    @GetMapping("/statistics")
    @ApiOperation("各个状态的订单数量统计")
    public Result<OrderStatisticsVO> statistics() {
        OrderStatisticsVO orderStatisticsVO = orderService.statistics();
        return Result.success(orderStatisticsVO);
    }

2.3.2 OrderService

    /**
     * 各个状态的订单数量统计
     * @return
     */
    OrderStatisticsVO statistics();

2.3.3 OrderServiceImpl

    /**
     * 各个状态的订单数量统计
     *
     * @return
     */
    public OrderStatisticsVO statistics() {
        // 根据状态,分别查询出待接单、待派送、派送中的订单数量
        Integer toBeConfirmed = orderMapper.countStatus(Orders.TO_BE_CONFIRMED);
        Integer confirmed = orderMapper.countStatus(Orders.CONFIRMED);
        Integer deliveryInProgress = orderMapper.countStatus(Orders.DELIVERY_IN_PROGRESS);

        // 将查询出的数据封装到orderStatisticsVO中响应
        OrderStatisticsVO orderStatisticsVO = new OrderStatisticsVO();
        orderStatisticsVO.setToBeConfirmed(toBeConfirmed);
        orderStatisticsVO.setConfirmed(confirmed);
        orderStatisticsVO.setDeliveryInProgress(deliveryInProgress);
        return orderStatisticsVO;
    }

2.3.4 OrderMapper

    /**
     * 根据状态统计订单数量
     * @param status
     */
    @Select("select count(id) from orders where status = #{status}")
    Integer countStatus(Integer status);

2.4 功能测试

3.查询订单详情

3.1 需求分析和设计

产品原型:

业务规则:

  • 订单详情页面需要展示订单基本信息(状态、订单号、下单时间、收货人、电话、收货地址、金额等)

  • 订单详情页面需要展示订单明细数据(商品名称、数量、单价)

3.2 接口设计

3.3 代码实现

3.3.1 admin/OrderController

    /**
     * 订单详情
     *
     * @param id
     * @return
     */
    @GetMapping("/details/{id}")
    @ApiOperation("查询订单详情")
    public Result<OrderVO> details(@PathVariable("id") Long id) {
        OrderVO orderVO = orderService.details(id);
        return Result.success(orderVO);
    }

3.4 功能测试

4.接单

4.1 需求分析和设计

产品原型:

业务规则:

  • 商家接单其实就是将订单的状态修改为“已接单”

4.2 接口设计

4.3 代码实现

4.3.1 admin/OrderController

    /**
     * 接单
     *
     * @return
     */
    @PutMapping("/confirm")
    @ApiOperation("接单")
    public Result confirm(@RequestBody OrdersConfirmDTO ordersConfirmDTO) {
        orderService.confirm(ordersConfirmDTO);
        return Result.success();
    }

4.3.2 OrderService

    /**
     * 接单
     *
     * @param ordersConfirmDTO
     */
    void confirm(OrdersConfirmDTO ordersConfirmDTO);

4.3.3 OrderServiceImpl

    /**
     * 接单
     *
     * @param ordersConfirmDTO
     */
    public void confirm(OrdersConfirmDTO ordersConfirmDTO) {
        Orders orders = Orders.builder()
                .id(ordersConfirmDTO.getId())
                .status(Orders.CONFIRMED)
                .build();

        orderMapper.update(orders);
    }

4.4 功能测试

5.拒单

5.1 需求分析和设计

产品原型:

业务规则:

  • 商家拒单其实就是将订单状态修改为“已取消”

  • 只有订单处于“待接单”状态时可以执行拒单操作

  • 商家拒单时需要指定拒单原因

  • 商家拒单时,如果用户已经完成了支付,需要为用户退款


 

5.2 接口设计

5.3 代码实现

5.3.1 admin/OrderController

    /**
     * 拒单
     *
     * @return
     */
    @PutMapping("/rejection")
    @ApiOperation("拒单")
    public Result rejection(@RequestBody OrdersRejectionDTO ordersRejectionDTO) throws Exception {
        orderService.rejection(ordersRejectionDTO);
        return Result.success();
    }

5.3.2 OrderService

    /**
     * 拒单
     *
     * @param ordersRejectionDTO
     */
    void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception;

5.3.3 OrderServiceImpl

	/**
     * 拒单
     *
     * @param ordersRejectionDTO
     */
    public void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception {
        // 根据id查询订单
        Orders ordersDB = orderMapper.getById(ordersRejectionDTO.getId());

        // 订单只有存在且状态为2(待接单)才可以拒单
        if (ordersDB == null || !ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }

        //支付状态
        Integer payStatus = ordersDB.getPayStatus();
        if (payStatus == Orders.PAID) {
            //用户已支付,需要退款
            String refund = weChatPayUtil.refund(
                    ordersDB.getNumber(),
                    ordersDB.getNumber(),
                    new BigDecimal(0.01),
                    new BigDecimal(0.01));
            log.info("申请退款:{}", refund);
        }

        // 拒单需要退款,根据订单id更新订单状态、拒单原因、取消时间
        Orders orders = new Orders();
        orders.setId(ordersDB.getId());
        orders.setStatus(Orders.CANCELLED);
        orders.setRejectionReason(ordersRejectionDTO.getRejectionReason());
        orders.setCancelTime(LocalDateTime.now());

        orderMapper.update(orders);
    }

5.4 功能测试

6.取消订单

6.1 需求分析和设计

产品原型:

业务规则:

  • 取消订单其实就是将订单状态修改为“已取消”

  • 商家取消订单时需要指定取消原因

  • 商家取消订单时,如果用户已经完成了支付,需要为用户退款

6.2 接口设计

6.3 代码实现

6.3.1 admin/OrderController

    /**
     * 取消订单
     *
     * @return
     */
    @PutMapping("/cancel")
    @ApiOperation("取消订单")
    public Result cancel(@RequestBody OrdersCancelDTO ordersCancelDTO) throws Exception {
        orderService.cancel(ordersCancelDTO);
        return Result.success();
    }

6.3.2 OrderService

    /**
     * 商家取消订单
     *
     * @param ordersCancelDTO
     */
    void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception;

6.3.3 OrderServiceImpl

	/**
     * 取消订单
     *
     * @param ordersCancelDTO
     */
    public void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception {
        // 根据id查询订单
        Orders ordersDB = orderMapper.getById(ordersCancelDTO.getId());

        //支付状态
        Integer payStatus = ordersDB.getPayStatus();
        if (payStatus == 1) {
            //用户已支付,需要退款
            String refund = weChatPayUtil.refund(
                    ordersDB.getNumber(),
                    ordersDB.getNumber(),
                    new BigDecimal(0.01),
                    new BigDecimal(0.01));
            log.info("申请退款:{}", refund);
        }

        // 管理端取消订单需要退款,根据订单id更新订单状态、取消原因、取消时间
        Orders orders = new Orders();
        orders.setId(ordersCancelDTO.getId());
        orders.setStatus(Orders.CANCELLED);
        orders.setCancelReason(ordersCancelDTO.getCancelReason());
        orders.setCancelTime(LocalDateTime.now());
        orderMapper.update(orders);
    }

6.4 功能测试

7.派送订单

7.1 需求分析和设计

产品原型:

业务规则:

  • 派送订单其实就是将订单状态修改为“派送中”

  • 只有状态为“待派送”的订单可以执行派送订单操作

7.2 接口设计

7.3 代码实现

7.3.1 admin/OrderController

    /**
     * 派送订单
     *
     * @return
     */
    @PutMapping("/delivery/{id}")
    @ApiOperation("派送订单")
    public Result delivery(@PathVariable("id") Long id) {
        orderService.delivery(id);
        return Result.success();
    }

7.3.2 OrderService

    /**
     * 派送订单
     *
     * @param id
     */
    void delivery(Long id);

7.3.3 OrderServiceImpl

    /**
     * 派送订单
     *
     * @param id
     */
    public void delivery(Long id) {
        // 根据id查询订单
        Orders ordersDB = orderMapper.getById(id);

        // 校验订单是否存在,并且状态为3
        if (ordersDB == null || !ordersDB.getStatus().equals(Orders.CONFIRMED)) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }

        Orders orders = new Orders();
        orders.setId(ordersDB.getId());
        // 更新订单状态,状态转为派送中
        orders.setStatus(Orders.DELIVERY_IN_PROGRESS);

        orderMapper.update(orders);
    }

7.4 功能测试

8.完成订单

8.1 需求分析和设计

产品原型:

业务规则:

  • 完成订单其实就是将订单状态修改为“已完成”

  • 只有状态为“派送中”的订单可以执行订单完成操作

8.2 接口设计

8.3 代码实现

8.3.1 admin/OrderController

    /**
     * 完成订单
     *
     * @return
     */
    @PutMapping("/complete/{id}")
    @ApiOperation("完成订单")
    public Result complete(@PathVariable("id") Long id) {
        orderService.complete(id);
        return Result.success();
    }

8.3.2 OrderService

    /**
     * 完成订单
     *
     * @param id
     */
    void complete(Long id);

8.3.3 OrderServiceImpl

    /**
     * 完成订单
     *
     * @param id
     */
    public void complete(Long id) {
        // 根据id查询订单
        Orders ordersDB = orderMapper.getById(id);

        // 校验订单是否存在,并且状态为4
        if (ordersDB == null || !ordersDB.getStatus().equals(Orders.DELIVERY_IN_PROGRESS)) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }

        Orders orders = new Orders();
        orders.setId(ordersDB.getId());
        // 更新订单状态,状态转为完成
        orders.setStatus(Orders.COMPLETED);
        orders.setDeliveryTime(LocalDateTime.now());

        orderMapper.update(orders);
    }

8.4 功能测试

<think>好的,我现在需要解决用户提出的Java编译时出现的java.lang.NoSuchFieldError问题。用户提到的错误是JCImport qualid,这可能涉及Java编译器的内部类或字段。首先,我应该先理解这个错误的一般原因,然后具体分析用户提到的JCImport qualid的情况。 首先,NoSuchFieldError通常发生在运行时,当JVM试图访问一个类的特定字段,但该字段不存在时。但用户提到的是编译时错误,这有点矛盾,因为一般来说NoSuchFieldError是运行时异常。可能用户是在编译过程中触发了某些动态加载或使用了注解处理器等机制,导致在编译阶段就引用了缺失的字段,从而报错。需要确认用户的环境和操作步骤。 接下来,JCImport是Java Compiler的一部分,属于com.sun.tools.javac.tree.JCTree类中的一个内部类。qualid可能指的是JCImport中的某个字段名。如果这个字段不存在,可能是因为使用的JDK版本中JCImport类的结构发生了变化,导致旧的代码或库引用了不存在的字段。 可能的原因包括: 1. JDK版本不兼容:用户可能升级了JDK版本,而依赖的库或框架是基于旧版本JDK编译的,导致字段不存在。 2. 依赖冲突:项目中可能存在多个版本的库,尤其是涉及编译器API的库(如Lombok、MapStruct等),它们可能引用了不同版本的JDK内部类。 3. 直接使用内部API:如果用户代码或第三方库直接调用了JDK的内部类(如com.sun.tools.javac下的类),而这些类在不同版本中有变动,就会导致该错误。 解决方案方面: 1. 检查JDK版本:确认项目使用的JDK版本与依赖库兼容。如果库需要旧版本JDK,可能需要降级或更新库版本。 2. 排除冲突依赖:检查Maven或Gradle依赖树,排除重复或冲突的库版本。 3. 避免使用内部API:建议不要直接使用com.sun包下的类,因为这些是内部实现,可能随版本变化。 4. 更新相关插件:如使用注解处理器或编译器插件,确保其版本与当前JDK兼容。 5. 清理构建缓存:有时候旧的编译缓存可能导致问题,清理后重新构建可能解决。 用户提到的JCImport qualid字段,可能在旧版本中存在,但在新版本中被移除或改名。例如,在某些JDK版本中,JCImport类的字段名可能有变化,导致依赖该字段的代码在编译时找不到而报错。 需要进一步验证,比如查看当前JDK版本的JCImport类结构,确认qualid是否存在。如果不存在,则需要找到替代的字段或方法,或者回退到支持该字段的JDK版本。 此外,用户可能在使用某些框架或工具时间接引用了这些内部类,比如Lombok在旧版本中可能依赖特定的JDK内部API,而升级JDK后不兼容,导致问题。此时需要升级Lombok到适配新JDK的版本。 总结来说,处理该问题的步骤是:确认JDK版本与依赖库的兼容性,检查是否有直接使用内部API的情况,排除依赖冲突,更新相关库和工具版本,清理并重新构建项目。</think>### Java编译时出现`java.lang.NoSuchFieldError: JCImport qualid`的原因及解决方案 #### 问题原因 1. **JDK版本不兼容** `JCImport`是`com.sun.tools.javac.tree.JCTree`的内部类,其字段`qualid`可能因JDK版本更新被移除或修改。例如,从JDK 8升级到JDK 11时,某些内部API结构可能发生变化[^1]。 2. **依赖库调用内部API** 第三方库(如Lombok、MapStruct)或项目代码直接使用了JDK内部类(如`com.sun.tools.javac`包中的类),而这些类在新版JDK中已调整[^2]。 3. **依赖冲突** Maven/Gradle依赖中存在多个版本的编译器相关库(如`tools.jar`),导致加载了不兼容的类文件。 --- #### 解决方案 ##### 1. 检查并调整JDK版本 - **降级JDK**:暂时回退到库支持的JDK版本(如从JDK 17退回JDK 11)。 - **升级依赖库**:确认使用的库是否支持当前JDK版本。例如,Lombok 1.18.24+支持JDK 17[^3]。 ##### 2. 排除依赖冲突 在构建文件中排查冲突依赖(以Maven为例): ```xml <dependency> <groupId>org.example</groupId> <artifactId>problematic-lib</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>com.sun</groupId> <artifactId>tools</artifactId> </exclusion> </exclusions> </dependency> ``` ##### 3. 避免使用内部API - 替换直接调用`com.sun.tools.javac`的代码,改用标准API(如Java Compiler Tree API)。 - 若必须使用内部API,添加编译参数`--add-exports`(JDK 9+): ```bash javac --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED ``` ##### 4. 清理并重新构建 - 删除`target`(Maven)或`build`(Gradle)目录。 - 使用命令清理缓存: ```bash mvn clean install # Maven gradle clean build # Gradle ``` --- #### 示例:依赖库兼容性调整(Gradle) ```gradle dependencies { // 确保Lombok与JDK 17+兼容 annotationProcessor 'org.projectlombok:lombok:1.18.30' compileOnly 'org.projectlombok:lombok:1.18.30' } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值