1 创建订单
用户使用portal创建订单、android、ios、微信商城提交订单时使用。
请求方法 | POST |
URL | http://order.taotao.com/order/create |
参数说明 |
提交的数据格式: { "payment": 5288, "postFee": 0, "userId": "3", "buyerMessage": null, "buyerNick": "zhang123", "orderItems": [ { "itemId": "9", "num": 1, "title": "苹果(Apple)iPhone 6 (A1586) 16GB 金色 移动联通电信4G手机3", "price": 5288, "totalFee": 5288, "picPath": "http://image.taotao.com/images/2015/03/06/2015030610045320609720.jpg" } ], "orderShipping": { "receiverName": "张三", "receiverPhone": "", "receiverMobile": "15800000000", "receiverState": "上海", "receiverCity": "上海", "receiverDistrict": "闵行区", "receiverAddress": "三鲁公路3279号 明浦广场 3号楼 205室", "receiverZip": "200000" } }
|
示例 |
|
返回值 | { status: 200 //200 成功 msg: "OK" // 返回信息消息 data: 100544// 返回订单号 }
|
2 根据订单ID查询订单
请求方法 | GET |
URL | http://order.taotao.com/order/info/{orderId} |
参数说明 |
orderId:订单编号
|
示例 | http://order.taotao.com/order/info/31414485440695 |
返回值 | { "status": 200, "msg": "OK", "data": { "orderId":"100544", "payment": 5288, "paymentType":1 "status":1 "createTime":"2015-01-01 08:22:14" "postFee": 0, "userId": "3", "buyerMessage": null, "buyerNick": "zhang123", "orderItems": [ { "itemId": "9", "num": 1, "title": "苹果(Apple)iPhone 6 (A1586) 16GB 金色 移动联通电信4G手机3", "price": 5288, "totalFee": 5288, "picPath": "http://image.taotao.com/images/2015/03/06/2015030610045320609720.jpg" } ], "orderShipping": { "receiverName": "张三", "receiverPhone": "", "receiverMobile": "15800000000", "receiverState": "上海", "receiverCity": "上海", "receiverDistrict": "闵行区", "receiverAddress": "三鲁公路3279号 明浦广场 3号楼 205室", "receiverZip": "200000" } } } |
3 根据用户分页查询订单
请求方法 | GET |
URL | http://order.taotao.com/order/list/{userID}/{page}/{count} |
参数说明 | userID:用户ID Page:请求的页码 Count:每页显示的记录数 |
示例 | http://order.taotao.com/order/list/zhang123/1/5 |
返回值 | { "status": 200, "msg": "OK", "data": [{ "orderId":"100544", "payment": 5288, "paymentType":1 "status":1 "createTime":"2015-01-01 08:22:14" "postFee": 0, "userId": "3", "buyerMessage": null, "buyerNick": "zhang123", },{ "orderId":"100545", "payment": 5288, "paymentType":1 "status":1 "createTime":"2015-01-01 08:22:15" "postFee": 0, "userId": "3", "buyerMessage": null, "buyerNick": "zhang123", },{ "orderId":"100546", "payment": 5288, "paymentType":1 "status":1 "createTime":"2015-01-01 08:22:16" "postFee": 0, "userId": "3", "buyerMessage": null, "buyerNick": "zhang123", }] } |
4 修改订单状态
请求方法 | POST |
URL | http://order.taotao.com/order/changeStatus |
参数说明 |
{ "orderId": "100544",//订单编号 "status": 2, //订单状态 "paymentTime": "1414489420444" //付款时间 }
|
示例 | http://sso.taotao.com/user/check/zhangsan;t=1 |
返回值 | { status: 200 //200 成功 msg: "OK" // 返回信息消息 data: null // 返回数据 }
|
1.1.1 Dao层
要对三个表进行操作。都是插入操作。可以使用逆向工程生成的代码。
1.1.2 Service层
功能:接收三个参数,
1、对应订单表的pojo。
2、订单明细表对应的商品列表。每个元素是订单明细表对应的pojo
3、物流表对应的pojo
订单号的生成:
解决方案一(不能使用):
使用mysql的自增长。
优点:不需要我们自己生成订单号,mysql会自动生成。
缺点:如果订单表数量太大时需要分库分表,此时订单号会重复。如果数据备份后再恢复,订单号会变。
方案二:日期+随机数
采用毫秒+随机数。
缺点:仍然有重复的可能。不建议采用此方案。在没有更好的解决方案之前可以使用。
方案三:使用UUID
优点:不会重复。
缺点:长。可读性查。不建议使用。
方案四:可读性好,不能太长。一般订单都是全数字的。可以使用redis的incr命令生成订单号。
优点:可读性好,不会重复
缺点:需要搭建redis服务器。
返回值:TaotaoResult
@Service public class OrderServiceImpl implements OrderService {
@Autowired private TbOrderMapper orderMapper; @Autowired private TbOrderItemMapper orderItemMapper; @Autowired private TbOrderShippingMapper orderShippingMapper; @Autowired private JedisClient jedisClient;
@Value("${ORDER_GEN_KEY}") private String ORDER_GEN_KEY; @Value("${ORDER_INIT_ID}") private String ORDER_INIT_ID; @Value("${ORDER_DETAIL_GEN_KEY}") private String ORDER_DETAIL_GEN_KEY;
@Override public TaotaoResult createOrder(TbOrder order, List<TbOrderItem> itemList, TbOrderShipping orderShipping) { //向订单表中插入记录 //获得订单号 String string = jedisClient.get(ORDER_GEN_KEY); if (StringUtils.isBlank(string)) { jedisClient.set(ORDER_GEN_KEY, ORDER_INIT_ID); } long orderId = jedisClient.incr(ORDER_GEN_KEY); //补全pojo的属性 order.setOrderId(orderId + ""); //状态:1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭 order.setStatus(1); Date date = new Date(); order.setCreateTime(date); order.setUpdateTime(date); //0:未评价 1:已评价 order.setBuyerRate(0); //向订单表插入数据 orderMapper.insert(order); //插入订单明细 for (TbOrderItem tbOrderItem : itemList) { //补全订单明细 //取订单明细id long orderDetailId = jedisClient.incr(ORDER_DETAIL_GEN_KEY); tbOrderItem.setId(orderDetailId + ""); tbOrderItem.setOrderId(orderId + ""); //向订单明细插入记录 orderItemMapper.insert(tbOrderItem); } //插入物流表 //补全物流表的属性 orderShipping.setOrderId(orderId + ""); orderShipping.setCreated(date); orderShipping.setUpdated(date); orderShippingMapper.insert(orderShipping);
return TaotaoResult.ok(orderId); }
} |
1.1.3 Controller层
接收一个json格式的字符串作为参数。需要使用@RequestBody注解。需要使用一个pojo接收参数。创建一个对应json格式的pojo。
package com.taotao.order.pojo;
import java.util.List;
import com.taotao.pojo.TbOrder; import com.taotao.pojo.TbOrderItem; import com.taotao.pojo.TbOrderShipping;
public class Order extends TbOrder {
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; }
}
|
Controller
@Controller public class OrderController {
@Autowired private OrderService orderService;
@RequestMapping("/create") @ResponseBody public TaotaoResult createOrder(@RequestBody Order order) { try { TaotaoResult result = orderService.createOrder(order, order.getOrderItems(), order.getOrderShipping()); return result; } catch (Exception e) { e.printStackTrace(); return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e)); } } } |
2 在前台系统生成订单
在taotao-portal系统中添加商品至购物车后,点击提交订单调用taotao-order的服务生成订单。向用户展示订单号。提示创建订单成功。
2.1 点击购物车“去结算”按钮
点击“去结算”按钮跳转到订单确认页面。
展示url:/order/order-cart.html
@Controller @RequestMapping("/order") public class OrderController {
@RequestMapping("/order-cart") public String showOrderCart() { return "order-cart"; } } |
2.2 订单确认页面
1、要求用户登录。
2、根据用户id查询用户的收货地址列表。
3、在此页面展示购物车的商品列表。
4、需要计算订单的总金额(包括运费)展示给用户。
2.2.1 要求用户登录
修改springmvc.xml拦截所有以:/order/**形式的url
2.2.2 根据用户id查询用户的收货地址列表。
在实际的商城中是必须有此功能,需要taotao-rest发布服务,由taotao-portal根据用户查询用户的收货地址列表。
在此,使用静态数据模拟。
2.2.3 展示购物车的商品列表
需要从cookie中把购物车商品列表取出,传递给order-cart.jsp。
可以直接使用购物车服务。
@Controller @RequestMapping("/order") public class OrderController {
@Autowired private CartService cartService;
@RequestMapping("/order-cart") public String showOrderCart(HttpServletRequest request, HttpServletResponse response, Model model) { //取购物车商品列表 List<CartItem> list = cartService.getCartItemList(request, response); //传递给页面 model.addAttribute("cartList", list);
return "order-cart"; } } |
2.3 提交订单
点击“提交订单”按钮把用户已经确认的订单信息,提交给后台。提交一个隐藏的表单,其中包含订单基本信息,订单名称以及配送信息。需要使用一个包装的pojo接收表单中的内容。
请求的url:/order/create.html
参数:表单中的内容。使用Order接收表单的内容。
返回值:返回一个jsp页面。
2.3.1 Service层
接收Order对象,调用taotao-order提供的服务,提交订单。需要把pojo转换成json数据。调用taotao-order提供的服务返回taotaoResult,包含订单号。
参数:Order
返回值:String(订单号)
@Service public class OrderServiceImpl implements OrderService {
@Value("${ORDER_BASE_URL}") private String ORDER_BASE_URL; @Value("${ORDER_CREATE_URL}") private String ORDER_CREATE_URL;
@Override public String createOrder(Order order) { //调用taotao-order的服务提交订单。 String json = HttpClientUtil.doPostJson(ORDER_BASE_URL + ORDER_CREATE_URL, JsonUtils.objectToJson(order)); //把json转换成taotaoResult TaotaoResult taotaoResult = TaotaoResult.format(json); if (taotaoResult.getStatus() == 200) { Long orderId = (Long) taotaoResult.getData(); return orderId.toString(); } return ""; }
} |
2.3.2 Controller层
接收页面提交的表单的内容,调用Service创建订单。返回成功页面。
@Controller @RequestMapping("/order") public class OrderController {
@Autowired private CartService cartService;
@Autowired private OrderService orderService;
@RequestMapping("/order-cart") public String showOrderCart(HttpServletRequest request, HttpServletResponse response, Model model) { //取购物车商品列表 List<CartItem> list = cartService.getCartItemList(request, response); //传递给页面 model.addAttribute("cartList", list);
return "order-cart"; }
@RequestMapping("/create") public String createOrder(Order order, Model model) { String orderId = orderService.createOrder(order); model.addAttribute("orderId", orderId); model.addAttribute("payment", order.getPayment()); model.addAttribute("date", new DateTime().plusDays(3).toString("yyyy-MM-dd")); return "success"; }
} |