1. 提交订单
1.1. 功能分析
1、在订单确认页面点击“提交订单”按钮生成订单。
2、恳求的url:/order/create
3、参数:提交的是表单的数据。保管的数据:订单、订单明细、配送地址。
a) 向tb_order中插入记录。
i. 订单号需要手动生成。
要求订单号不能反复。
订单号可读性号。
可以使用redis的incr命令生成订单号。订单号需要一个初始值。
ii. Payment:表单数据
iii. payment_type:表单数据
iv. user_id:用户信息
v. buyer_nick:用户名
vi. 其他字段null
b) 向tb_order_item订单明细表插入数据。
i. Id:使用incr生成
ii. order_id:生成的订单号
iii. 其他的都是表单中的数据。
c) tb_order_shipping,订单配送信息
i. order_id:生成的订单号
ii. 其他字段都是表单中的数据。
d) 使用pojo接收表单的数据。
可以扩展TbOrder,在子类中添加两个属性一个是商品明细列表,一个是配送信息。
把pojo放到e3-order-interface工程中。 /** * 用于寄存用户提交订单信息 * @Auther: jun * @Date: 2018/6/1 0001 21:45 * @Description:*/public class OrderInfo extends TbOrder implements Serializable { private List<TbOrderItem> orderItems; private TbOrderShipping orderShipping; public List<TbOrderItem> getOrderItems() { return orderItems;} public void setOrderItems(List<TbOrderItem> orderItems) { this.orderItems = orderItems;} public TbOrderShipping getOrderShipping() { return orderShipping;} public void setOrderShipping(TbOrderShipping orderShipping) { this.orderShipping = orderShipping;}}业务逻辑:
1、接收表单的数据
2、生成订单id
3、向订单表插入数据。
4、向订单明细表插入数据
5、向订单物流表插入数据。
6、返回e3Result。
返回值:e3Result
1.1. Dao层
可以使用逆向工程。
1.1. Service层
参数:OrderInfo
返回值:e3Result
/** * 订单Service * 订单需要操作三张数据到所有要注入三张表对应生成的mapper * @Auther: jun * @Date: 2018/6/1 0001 21:51 * @Description:*/@Servicepublic class OrderServiceImpl implements OrderService { @Autowiredprivate TbOrderMapper tbOrderMapper;@Autowiredprivate TbOrderItemMapper tbOrderItemMapper;@Autowiredprivate TbOrderShippingMapper tbOrderShippingMapper;@Autowiredprivate JedisClient jedisClient;@Value("${ORDER_ID_GEN_KEY}") private String ORDER_ID_GEN_KEY;@Value("${ORDER_ID_START}") private String ORDER_ID_START;@Value("${ORDER_DETAIL_ID_GEN_KEY}") private String ORDER_DETAIL_ID_GEN_KEY;@Overridepublic E3Result createOrder(OrderInfo orderInfo) { //生订单是最好给定初始值所以要判断一下if (!jedisClient.exists(ORDER_ID_GEN_KEY)) { //设置初始值,从ORDER_ID_START数开端jedisClient.set(ORDER_ID_GEN_KEY,ORDER_ID_START);} //生成订单号,使用redis的incr生成String orderId=jedisClient.incr(ORDER_ID_GEN_KEY).toString();//补全OrderInfo属性 //idorderInfo.setOrderId(orderId);//'状态:1、未付款,2、已付款,3、未发货,4、已发货,5、交易胜利,6、交易关闭'orderInfo.setStatus(1);orderInfo.setCreateTime(new Date());orderInfo.setUpdateTime(new Date());//插入订单表tbOrderMapper.insert(orderInfo);//向订单明细表插入数据List<TbOrderItem> orderItems=orderInfo.getOrderItems();//遍历for (TbOrderItem orderItem:orderItems){ //生成订单明细idString orderItem_Id=jedisClient.incr(ORDER_DETAIL_ID_GEN_KEY).toString();//补全明细属性orderItem.setId(orderItem_Id);orderItem.setOrderId(orderId);//向明细表插入数据tbOrderItemMapper.insert(orderItem);} //向订单物流表插入数据 //从订单详细中获得订单物流对象TbOrderShipping tbOrderShipping=orderInfo.getOrderShipping();//补全属性tbOrderShipping.setOrderId(orderId);tbOrderShipping.setCreated(new Date());tbOrderShipping.setUpdated(new Date());//向订单物流插入数据tbOrderShippingMapper.insert(tbOrderShipping);//返回胜利,包含订单号return E3Result.ok(orderId);}}1.1. Controller
恳求的url:/order/create
参数:使用OrderInfo接收
返回值:逻辑视图。
业务逻辑:
1、接收表单提交的数据OrderInfo。
2、补全用户信息。
3、调用Service创建订单。
4、返回逻辑视图展示胜利页面
a) 需要Service返回订单号
在拦截器中添加用户处置逻辑:
Controller代码
/** * 提交订单 * * @param orderInfo,model * @auther: jun * @date: 2018/6/1 0001 22:29 * @return: java.lang.String * @Description:*/@RequestMapping(value = "order/create", method = RequestMethod.POST)public String createOrder(OrderInfo orderInfo, Model model, HttpServletRequest request) { //取用户信息TbUser user = (TbUser) request.getAttribute ( "user" );//把用户信息添加到orderInfo中orderInfo.setUserId ( user.getId () );orderInfo.setBuyerNick ( user.getUsername () );//调用效劳消费订单E3Result result=orderService.createOrder (orderInfo);//假设订单生成胜利,需要删除购物车if (result.getStatus ()==200){ cartService.clearCartItem (user.getId ());} //返回页面需要参数 //把订单号转递给页面request.setAttribute ("orderId",result.getData ());request.setAttribute ("payment",orderInfo.getPayment ());//返回逻辑视图return "success";} |