订单模块
订单几大模块,创建,查询,取消,完成,总的来说都是增删改查,逻辑较为简单,注意的点还是在于避免横向越权和纵向越权
创建订单
先从购物车中拿到数据,后计算所有的总价生成订单号,再插入order表,然后把订单表子项批量插入orderItem表,然后清楚购物车,减少库存,把详情返回给前端
订单号的生成很重要也有一套要求,以后再讲,先暂且用时间加随机数生成
要把orderItemList插入表中,需要用到Mybatis的批量插入
在orderItemMapper里新增一个方法
void batchInsert(@Param("orderItemList") List<OrderItem> orderItemList);
然后去xml文件里写实现,用foreach循环插入
<select id="batchInsert" parameterType="list">
insert into mmall_order_item (id, order_no, user_id,
product_id, product_name, product_image,
current_unit_price, quantity, total_price,
create_time, update_time)
values
<foreach collection="orderItemList" index="index" item="item" separator=",">
(
#{item.id},#{item.orderNo},#{item.userId},#{item.productId},#{item.productName},#{item.productImage},#{item.currentUnitPrice},#{item.quantity},#{item.totalPrice},now(),now()
)
</foreach>
</select>
在返回给前端的数据肯定会进行一些修饰改变,去掉不需要的部分,所有又要新建几个Vo,并且组装填充数据返回给前端,
没什么特别要注意的,详见代码吧
取消订单
取消订单的话要注意验证用户和订单是否一致,已付款的订单就无法取消了,以后再写对接支付宝的退款,service如下
public ServerResponse<String> cancel(Integer userId,Long orderNo){
Order order = orderMapper.selectByUserIdAndOrderNo(userId,orderNo);
if(order == null){
return ServerResponse.createByErrorMessage("该用户此订单不存在");
}
if(order.getStatus() != Const.OrderStatusEnum.NO_PAY.getCode()){
return ServerResponse.createByErrorMessage("已付款,无法取消订单");
}
Order updateOrder = new Order();
updateOrder.setId(order.getId());
updateOrder.setStatus(Const.OrderStatusEnum.CANCELED.getCode());
int row = orderMapper.updateByPrimaryKeySelective(updateOrder);
if(row > 0){
return ServerResponse.createBySuccess();
}
return ServerResponse.createByError();
}
查看购物车中选中的商品
也就是拿出选中的商品并且组装一个适合返回给前端的Vo
public ServerResponse getOrderCartProduct(Integer userId){
OrderProductVo orderProductVo = new OrderProductVo();
//从购物车中获取数据
List<Cart> cartList = cartMapper.selectCheckedCartByUserId(userId);
ServerResponse serverResponse = this.getCartOrderItem(userId,cartList);
if(!serverResponse.isSuccess()){
return serverResponse;
}
List<OrderItem> orderItemList =( List<OrderItem> ) serverResponse.getData();
List<OrderItemVo> orderItemVoList = Lists.newArrayList();
BigDecimal payment = new BigDecimal("0");
for(OrderItem orderItem : orderItemList){
payment = BigDecimalUtil.add(payment.doubleValue(),orderItem.getTotalPrice().doubleValue());
orderItemVoList.add(assembleOrderItemVo(orderItem));
}
orderProductVo.setProductTotalPrice(payment);
orderProductVo.setOrderItemVoList(orderItemVoList);
orderProductVo.setImageHost(PropertiesUtil.getProperty("ftp.server.http.prefix"));
return ServerResponse.createBySuccess(orderProductVo);
}
用户查看订单详情
简单的查询数据而已,详见代码,项目代码在最后给出