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
private TbOrderShipping orderShipping;
public List
return orderItems;
}
public void setOrderItems(List
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
//遍历
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";
}