苍穹外卖day09

查看历史订单(本质还是分页查询)

首先理清关系,传过来的是每页和总共页数

交给PageHelper去查询返回的是

其次需要去查的是历史的订单

传入Mapper的参数应该是pageQueryDTO

所以把参数都set好传给DTO

查到的是我们的page
Page page = userMapper.pageQuery(ordersPageQueryDTO);
其他的Employee可以查的很完整所以可以直接返回EmployeeVO这里不可以所以需要完善信息

当然信息不够完整,因为Orders没有包含Detaill的信息

所以我们还需要去查Order_Detaill 的表去完善这个返回的参数OrderVO

最后返回new PageResult(totalNumber,List)给Controller的pageResult
然后由Controller返回Result.success(pageResult)

这个和Dish的分页查询 dish_flavor很像,都是查不明白,需要再去查另外一个表补全信息,然后返回

 public PageResult pageQueryUser(int pageNum, int pageSize, Integer status){


        PageHelper.startPage(pageNum,pageSize);


        OrdersPageQueryDTO ordersPageQueryDTO = new OrdersPageQueryDTO();
        ordersPageQueryDTO.setPage(pageNum);
        ordersPageQueryDTO.setPageSize(pageSize);
        ordersPageQueryDTO.setStatus(status);
        ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());

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


        List<OrderVO> list = new ArrayList<>();

        if(page != null && page.size()>0){

            for(Orders orders:page){

                Long id = orders.getId();
                List<OrderDetail> orderDetail = orderDetailMapper.getById(id);

                OrderVO orderVO = new OrderVO();
                orderVO.setOrderDetailList(orderDetail);
                BeanUtils.copyProperties(orders,orderVO);
                list.add(orderVO);
            }
        }

        long total = page.getTotal();
        //List<Orders> result = pageRes.getResult();



        return new PageResult(total,list);


    }
 <select id="pageQuery" resultType="com.sky.entity.Orders">
        select * from orders
        <where>
            <if test="number != null and number!=''">
                and number like concat('%',#{number},'%')
            </if>
            <if test="phone != null and phone!=''">
                and phone like concat('%',#{phone},'%')
            </if>
            <if test="userId != null">
                and user_id = #{userId}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
            <if test="beginTime != null">
                and order_time >= #{beginTime}
            </if>


        </where>

    </select>

查看订单详细

太简单了不写了,和上面的查询页面一样返回VO的时候需要set Detail的部分

再来一单(传入的直接是orderid)

直接去查OrderDetail就好了
然后把OrderDetail的值赋给shoppingcart然后批量插入就行了
秒了!
记得把shoppingcart的值set完整对着entity看一下哪里没有插入就可以了

public void repetitionById(long id){

        //id是订单id Order的ID 可以去查detail然后再插入到shoppingcart
        Orders orders = orderMapper.getById(id);
        List<OrderDetail> orderDetailList = orderDetailMapper.getById(orders.getId());

        List<ShoppingCart> shoppingCartList = new ArrayList<>();

        for(OrderDetail orderDetail : orderDetailList){
            ShoppingCart shoppingCart = new ShoppingCart();
            BeanUtils.copyProperties(orderDetail,shoppingCart);
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCart.setUserId(BaseContext.getCurrentId());
            shoppingCartList.add(shoppingCart);
        }
        shoppingCartMapper.insertBatch(shoppingCartList);

    }
 <insert id="insertBatch" parameterType="list">
        insert into shopping_cart
        (name, image, user_id, dish_id, setmeal_id, dish_flavor, number, amount, create_time)
        values
        <foreach collection="shoppingCartList"  item="sc" separator=",">
            (#{sc.name},#{sc.image},#{sc.userId},#{sc.dishId},#{sc.setmealId},#{sc.dishFlavor},#{sc.number},#{sc.amount},#{sc.createTime})
        </foreach>
    </insert>

取消订单(有一个退款操作需要调用Utils 其他记得抛异常就行)

	/**
     * 用户取消订单
     *
     * @param id
     */
    public void userCancelById(Long id) throws Exception {
        // 根据id查询订单
        Orders ordersDB = orderMapper.getById(id);

        // 校验订单是否存在
        if (ordersDB == null) {
            throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
        }

        //订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
        if (ordersDB.getStatus() > 2) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }

        Orders orders = new Orders();
        orders.setId(ordersDB.getId());

        // 订单处于待接单状态下取消,需要进行退款
        if (ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
            //调用微信支付退款接口
            weChatPayUtil.refund(
                    ordersDB.getNumber(), //商户订单号
                    ordersDB.getNumber(), //商户退款单号
                    new BigDecimal(0.01),//退款金额,单位 元
                    new BigDecimal(0.01));//原订单金额

            //支付状态修改为 退款
            orders.setPayStatus(Orders.REFUND);
        }

        // 更新订单状态、取消原因、取消时间
        orders.setStatus(Orders.CANCELLED);
        orders.setCancelReason("用户取消");
        orders.setCancelTime(LocalDateTime.now());
        orderMapper.update(orders);
    }

管理端查看订单(分页查询)

再强调一遍,controller返回的是PageResult
new pageResult(totalNumber,list<>)

所以Service需要去查List<。。。VO>返回给Controller

 @GetMapping("/conditionSearch")
    @ApiOperation("管理端订单搜索")
    public Result<PageResult> conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO){

        PageResult pageResult = orderService.conditionSearch(ordersPageQueryDTO);

        return Result.success(pageResult);
    }

查询用DTO去查询
然后在补全查不到的在别的表的数据,返回list<。。VO>给Controller

public PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO){

        PageHelper.startPage(ordersPageQueryDTO.getPage(),ordersPageQueryDTO.getPageSize());
        Page<Orders> page = userMapper.pageQuery(ordersPageQueryDTO);

        List<OrderVO> list =  new ArrayList<>();
        for(Orders orders:page){
            List<OrderDetail> orderDetailList = orderDetailMapper.getById(orders.getId());
            OrderVO orderVO = new OrderVO();
            orderVO.setOrderDetailList(orderDetailList);
            list.add(orderVO);
        }
        return new PageResult(page.getTotal(),list);
    }
### 关于苍穹外卖项目中使用MyBatis Plus的教程及代码示例 #### 使用MyBatis Plus简化CRUD操作 在苍穹外卖项目的`day09`阶段,为了提升数据库交互层的开发效率并减少样板代码的数量,采用了MyBatis Plus作为持久化框架。MyBatis Plus不仅继承了MyBatis原有的灵活性和强大功能,还提供了更简洁的操作方式[^2]。 ```java // 定义实体类对应表结构 @Data public class Order { private Long id; private String orderNo; private Integer userId; } // 继承BaseMapper获得基本增删改查能力 public interface OrderMapper extends BaseMapper<Order> {} ``` 通过上述定义,无需编写任何SQL语句即可实现对订单数据的基本操作,这得益于MyBatis Plus内置的支持自动识别字段名映射到对应的列上,并提供了一系列便捷的方法来执行常见的查询逻辑[^1]。 #### 动态条件构建优化查询性能 针对复杂业务场景下的多条件组合筛选需求,MyBatis Plus允许开发者利用其封装好的QueryWrapper对象来进行灵活组装: ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @Autowired private OrderMapper orderMapper; public List<Order> getOrdersByConditions(String orderNo, Integer userId) { QueryWrapper<Order> queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(orderNo)) { queryWrapper.eq("order_no", orderNo); } if (userId != null && userId > 0) { queryWrapper.eq("user_id", userId); } return orderMapper.selectList(queryWrapper); } ``` 此段代码展示了如何基于传入参数动态调整查询条件,从而达到精准检索的目的。同时,这种方式也使得后续维护更加容易理解与修改[^4]。 #### 自动生成代码加速迭代周期 考虑到实际开发过程中频繁涉及新增模块或调整已有模型的情况,MyBatis Plus支持通过插件形式快速生成所需的DAO层文件、Service接口及其默认实现等资源。对于像苍穹外卖这样的大型应用而言,这一特性极大地缩短了前期准备工作所需的时间成本。 ```bash mvn mybatis-plus:generator -Dmp.generator.config=src/main/resources/generatorConfig.xml ``` 以上命令可以根据预设模板批量产出符合项目规范的基础组件,帮助团队成员专注于核心业务逻辑的设计之上[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值