文章目录
卖家端主要完成几个功能:
查询所有买家的订单列表,查询某个买家的订单详情类表,完结订单,取消订单
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. 完结订单的方法