微信点餐SpringBoot-15:卖家订单的实现


卖家端主要完成几个功能:
查询所有买家的订单列表,查询某个买家的订单详情类表,完结订单,取消订单

1. OrderService接口

在OrderService接口中添加一个卖家查询所有订单的方法:

public interface OrderService {
    /**
     * 卖家查询所有的订单列表
     * @param pageable
     * @return
     */
    Page<OrderDTO> findList(Pageable pageable);
}

2. OrderServiceImpl

OrderService接口的实现类:

@Slf4j
@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    private OrderMasterRepository orderMasterRepository;
    /**
     * 查询所有的订单列表
     * @param pageable
     * @return
     */
    @Override
    public Page<OrderDTO> findList(Pageable pageable) {
        Page<OrderMaster> orderMasterPage = orderMasterRepository.findAll(pageable);

        List<OrderDTO> orderDTOList = OrderMaster2OrderDTO.convert(orderMasterPage.getContent());

        Page<OrderDTO> orderDTOPage
                = new PageImpl<OrderDTO>(orderDTOList,pageable,orderMasterPage.getTotalElements());

        return orderDTOPage;
    }
}

3. SellOrderController

Controller层

@Controller
@RequestMapping("/seller/order")
@Slf4j
public class SellOrderController {

    @Autowired
    private OrderService orderService;

    /**
     * 查询订单列表
     * @param page 第几页,从第一页开始
     * @param size 一页有多少条数据
     * @return
     */
    @RequestMapping("/list")
    public ModelAndView list(@RequestParam(value = "page",defaultValue = "1")Integer page,
                             @RequestParam(value = "size",defaultValue = "2")Integer size,
                             Map<String,Object> map){
        //定义的接口从第一页开始,但是方法时从第0页开始的
        PageRequest request = PageRequest.of(page-1,size);
        Page<OrderDTO> orderDTOPage = orderService.findList(request);
        map.put("orderDTOPage",orderDTOPage);
        map.put("currentPage",page);
        map.put("size",size);
        //通过模板引擎渲染
        return new ModelAndView("order/list",map);
    }

    /**
     * 取消订单
     * @param orderId
     * @return
     */
    @GetMapping("/cancel")
    public ModelAndView cancle(@RequestParam("orderId")String orderId,Map<String,Object> map){
        OrderDTO orderDTO = null;
        try {
            orderDTO = orderService.findOnes(orderId);
            orderService.cancel(orderDTO);
        } catch (Exception e) {
            log.error("【卖家端取消订单】查询不到订单", e);
            map.put("msg",e.getMessage());
            map.put("url","/sell/seller/order/list");
            return new ModelAndView("common/error",map);
        }

        map.put("msg",ResultEnum.ORDER_CANCLE_SUCCESS.getMessage());
        map.put("url","/sell/seller/order/list");
       return new ModelAndView("common/success",map);
    }

    /**
     * 订单详情类列表
     * @param orderId
     * @param map
     * @return
     */
    @GetMapping("/detail")
    public ModelAndView detail(@RequestParam("orderId")String orderId,Map<String,Object> map){
        OrderDTO orderDTO = null;
        try {
            orderDTO = orderService.findOnes(orderId);
        } catch (Exception e) {
            log.error("【卖家端取消订单】查询不到订单", e);
            map.put("msg",e.getMessage());
            map.put("url","/sell/seller/order/list");
            return new ModelAndView("common/error",map);
        }

        map.put("orderDTO",orderDTO);
        return new ModelAndView("order/detail",map);
    }

    /**
     * 订单完结
     * @param orderId
     * @param map
     * @return
     */
    @GetMapping("/finish")
    public ModelAndView finished(@RequestParam("orderId")String orderId,Map<String,Object> map){
        OrderDTO orderDTO = null;
        try {
            orderDTO = orderService.findOnes(orderId);
            orderService.finish(orderDTO);
        } catch (Exception e) {
            log.error("【卖家端完结订单】查询不到订单", e);
            map.put("msg",e.getMessage());
            map.put("url","/sell/seller/order/list");
            return new ModelAndView("common/error",map);
        }
        map.put("msg",ResultEnum.ORDER_FINISH_SUCCESS.getMessage());
        map.put("url","/sell/seller/order/list");
        return new ModelAndView("common/success",map);
    }
}

1. 查询订单列表方法

1、方法返回值类型:

因为需要用到模板引擎渲染前端页面,所以方法的返回值类型为ModelAndView
Model产生模型数据将结果页面上需要的数据放到ModelMap对象中,而视图View用于渲染模型数据,使用ModelAndView对象可以同时完成这两个功能。
在这里插入图片描述
2、方法的参数:

由于是分页查询,要传递查询的页数,和每页查询的条数,同时要传入一个ModelAndView对象
在这里插入图片描述
3、调用Service层方法:

首先方法的返回值类型和方法的参数都已经确定了,下一步要做的就是调用Service层的业务逻辑来实现查询订单列表。
其次查询出来的结果我们将其放在一个Model模型数据中,用于在前端页面中取出。
最后写一个转发页面View用于渲染模型数据,达到我们想要的页面效果。
在这里插入图片描述
4、View层前端页面:

细节上的改造这里不再说明:

<html>
    <head>
        <meta charset="utf-8"/>
        <title>买家商品列表</title>
        <!--引入的cs样式-->
        <link href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.min.css" rel="stylesheet">
    </head>
    <body>
    <#--主要内容content-->
    <div class="container-fluid">
        <div class="row clearfix">

            <div class="col-md-12 column">
                <table class="table table-bordered table-condensed">
                    <thead>
                    <tr>
                        <th>订单id</th>
                        <th>姓名</th>
                        <th>手机号</th>
                        <th>地址</th>
                        <th>金额</th>
                        <th>订单状态</th>
                        <th>支付状态</th>
                        <th>创建时间</th>
                        <th colspan="2">操作</th>
                    </tr>
                    </thead>
                    <tbody>
					<!--遍历取出Mode中的数据-->
                    <#list orderDTOPage.content as orderDTO>
                        <tr>
                            <td>${orderDTO.orderId}</td>
                            <td>${orderDTO.buyerName}</td>
                            <td>${orderDTO.buyerPhone}</td>
                            <td>${orderDTO.buyerAddress}</td>
                            <td>${orderDTO.orderAmount}</td>
                            <td>${orderDTO.getOrderStatusEnum().message}</td>
                            <td>${orderDTO.getPayStatusEnum().message}</td>
                            <td>${orderDTO.createTime}</td>
                            <td><a href="/sell/seller/order/detail?orderId=${orderDTO.orderId}">详情</a></td>
                            <td>
                                <#if orderDTO.getOrderStatusEnum().message == "新订单">
                                    <a href="/sell/seller/order/cancel?orderId=${orderDTO.orderId}">取消</a>
                                </#if>
                            </td>
                        </tr>
                    </#list>
                    </tbody>
                </table>
            </div>

                <#--分页-->
                <div class="col-md-12 column">
                    <ul class="pagination pull-right">
                        <#if currentPage lte 1>
                            <li class="disabled"><a href="#">上一页</a></li>
                        <#else>
                            <li><a href="/sell/seller/order/list?page=${currentPage - 1}&size=${size}">上一页</a></li>
                        </#if>

                        <#list 1..orderDTOPage.getTotalPages() as index>
                            <#if currentPage == index>
                                <li class="disabled"><a href="#">${index}</a></li>
                            <#else>
                                <li><a href="/sell/seller/order/list?page=${index}&size=${size}">${index}</a></li>
                            </#if>
                        </#list>

                        <#if currentPage gte orderDTOPage.getTotalPages()>
                            <li class="disabled"><a href="#">下一页</a></li>
                        <#else>
                            <li><a href="/sell/seller/order/list?page=${currentPage + 1}&size=${size}">下一页</a></li>
                        </#if>
                    </ul>
                </div>

            </div>
        </div>

    </body>
</html>

在这里插入图片描述

2. 取消订单的方法

1、方法的返回值类型和方法的参数:

由于需要渲染模型数据,因此返回值类型仍然为ModelAndView
根据订单的orderId来取消订单,同时需要传入Model对象
在这里插入图片描述
2、调用Service层的逻辑:

根据Service层的逻辑,取消订单和查询订单都有可能出现异常,比如查询的订单为空等,因此需要捕获异常,如果捕获到异常,跳转到一个错误页面(error.ftlh),并将异常信息(msg)放在模型数据中,同时在打印异常信息后希望实现页面的跳转,将跳转页面路径(url)也放在模型数据中。
通过在error.ftlh这个页面中取出我们放在模型中的数据(异常信息和跳转路径)
在这里插入图片描述
倘若没有捕获到异常,我们跳转到一个成功页面(success.ftlh),同时将结果信息(msg)和打印信息后跳转到订单列表页面的路径(url)放在模型数据中,在成功页面取出。

在这里插入图片描述
3、View层取出Model模型中的数据:

error.ftlh:

<html>
<head>
    <meta charset="utf-8">
    <title>错误提示</title>
    <link href="https://cdn.bootcss.com/bootstrap/3.0.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="container">
    <div class="row clearfix">
        <div class="col-md-12 column">
            <div class="alert alert-dismissable alert-danger">
                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
                <h4>
                    错误!
                </h4> <strong>${msg}</strong><a href="${url}" class="alert-link">3s后自动跳转</a>
            </div>
        </div>
    </div>
</div>

</body>

<script>
    setTimeout('location.href="${url}"', 3000);
</script>

</html>

在这里插入图片描述
success.ftlh:

<html>
<head>
    <meta charset="utf-8">
    <title>成功提示</title>
    <link href="https://cdn.bootcss.com/bootstrap/3.0.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="container">
    <div class="row clearfix">
        <div class="col-md-12 column">
            <div class="alert alert-dismissable alert-success">
                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
                <h4>
                    成功!
                </h4> <strong>${msg!""}</strong><a href="${url}" class="alert-link">3s后自动跳转</a>
            </div>
        </div>
    </div>
</div>

</body>

<script>
    setTimeout('location.href="${url}"', 3000);
</script>

</html>

在这里插入图片描述

3. 订单详情的方法

在这里插入图片描述

<html>
<head>
    <meta charset="utf-8"/>
    <title>买家商品列表</title>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <#--主要内容content-->
    <div class="container">
        <div class="row clearfix">
            <div class="col-md-4 column">
                <table class="table table-bordered">
                    <thead>
                    <tr>
                        <th>订单id</th>
                        <th>订单总金额</th>
                    </tr>
                    </thead>
                    <tbody>
                    <tr>
                        <td>${orderDTO.orderId}</td>
                        <td>${orderDTO.orderAmount}</td>
                    </tr>
                    </tbody>
                </table>
            </div>

            <#--订单详情表数据-->
            <div class="col-md-12 column">
                <table class="table table-bordered">
                    <thead>
                    <tr>
                        <th>商品id</th>
                        <th>商品名称</th>
                        <th>价格</th>
                        <th>数量</th>
                        <th>总额</th>
                    </tr>
                    </thead>
                    <tbody>
                    <#list orderDTO.orderDetailList as orderDetail>
                    <tr>
                        <td>${orderDetail.productId}</td>
                        <td>${orderDetail.productName}</td>
                        <td>${orderDetail.productPrice}</td>
                        <td>${orderDetail.productQuantity}</td>
                        <td>${orderDetail.productQuantity * orderDetail.productPrice}</td>
                    </tr>
                    </#list>
                    </tbody>
                </table>
            </div>

            <#--操作-->
            <div class="col-md-12 column">
            <#if orderDTO.getOrderStatusEnum().message == "新订单">
                <a href="/sell/seller/order/finish?orderId=${orderDTO.orderId}" type="button" class="btn btn-default btn-primary">完结订单</a>
                <a href="/sell/seller/order/cancel?orderId=${orderDTO.orderId}" type="button" class="btn btn-default btn-danger">取消订单</a>
            </#if>
            </div>
        </div>
    </div>

</body>
</html>

在这里插入图片描述

4. 完结订单的方法

在这里插入图片描述
在这里插入图片描述

发布了665 篇原创文章 · 获赞 115 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_42764468/article/details/104842033
今日推荐