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: */ @Service public class OrderServiceImpl implements OrderService { @Autowired private TbOrderMapper tbOrderMapper; @Autowired private TbOrderItemMapper tbOrderItemMapper; @Autowired private TbOrderShippingMapper tbOrderShippingMapper; @Autowired private 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; @Override public 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属性 //id orderInfo.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){ //生成订单明细id String 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"; }