网页设计案例下载,怎样做关键词排名优化,建筑网建设通查询,怎样做企业营销网站订单流程
订单流程是指从订单产生到完成整个流转的过程#xff0c;从而行程了一套标准流程规则。而不同的产品类型或业务类型在系统中的流程会千差万别#xff0c;比如上面提到的线上实物订单和虚拟订单的流程#xff0c;线上实物订单与 O2O 订单等#xff0c;所以需要根据…订单流程
订单流程是指从订单产生到完成整个流转的过程从而行程了一套标准流程规则。而不同的产品类型或业务类型在系统中的流程会千差万别比如上面提到的线上实物订单和虚拟订单的流程线上实物订单与 O2O 订单等所以需要根据不同的类型进行构建订单流程。不管类型如何订单都包括正向流程和逆向流程对应的场景就是购买商品和退换货流程正向流程就是一个正常的网购步骤
订单生成–支付订单–卖家发货–确认收货–交易成功。而每个步骤的背后订单是如何在多系统之间交互流转的可概括如下图 1、订单创建与支付
(1) 、订单创建前需要预览订单选择收货信息等
(2) 、订单创建需要锁定库存库存有才可创建否则不能创建
(3) 、订单创建后超时未支付需要解锁库存
(4) 、支付成功后需要进行拆单根据商品打包方式所在仓库物流等进行拆单
(5) 、支付的每笔流水都需要记录以待查账
(6) 、订单创建支付成功等状态都需要给 MQ 发送消息方便其他系统感知订阅
2、逆向流程
(1) 、修改订单用户没有提交订单可以对订单一些信息进行修改比如配送信息 优惠信息及其他一些订单可修改范围的内容此时只需对数据进行变更即可。
(2) 、订单取消用户主动取消订单和用户超时未支付两种情况下订单都会取消订
单而超时情况是系统自动关闭订单所以在订单支付的响应机制上面要做支付的限时处理尤其是在前面说的下单减库存的情形下面可以保证快速的释放库存。 另外需要需要处理的是促销优惠中使用的优惠券权益等视平台规则进行相应补 回给用户。
(3) 、退款在待发货订单状态下取消订单时分为缺货退款和用户申请退款。如果是 全部退款则订单更新为关闭状态若只是做部分退款则订单仍需进行进行同时生 成一条退款的售后订单走退款流程。退款金额需原路返回用户的账户。
(4) 、发货后的退款发生在仓储货物配送在配送过程中商品遗失用户拒收用户收货后对商品不满意这样情况下用户发起退款的售后诉求后需要商户进行退款的审核双方达成一致后系统更新退款状态对订单进行退款操作金额原路返回用户的账户同时关闭原订单数据。仅退款情况下暂不考虑仓库系统变化。如果发生双方协调不一致情况下可以申请平台客服介入。在退款订单商户不处理的情况下系统需要做限期判断比如 5 天商户不处理退款单自动变更同意退款。
OrderWebConfiguration
Configuration
public class OrderWebConfiguration implements WebMvcConfigurer {AutowiredLoginUserInterceptor loginUserInterceptor;Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginUserInterceptor).addPathPatterns(/***);}
}
GuliFeignConfig
public class GuliFeignConfig {Beanpublic RequestInterceptor requestInterceptor(){return new RequestInterceptor() {Overridepublic void apply(RequestTemplate template) {ServletRequestAttributes attributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request attributes.getRequest();//同步请求头数据String cookie request.getHeader(Cookie);template.header(Cookie,cookie);System.out.println(feign运程之前先进行构造);}};}
}
LoginUserInterceptor Component
public class LoginUserInterceptor implements HandlerInterceptor {public static ThreadLocalMemberResponseVo loginUsernew ThreadLocal();Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {MemberResponseVo attribute (MemberResponseVo) request.getSession().getAttribute(AuthServerConstant.LOGIN_USER);if(attribute!null){loginUser.set(attribute);return true;}else{request.getSession().setAttribute(msg,请先进行登录);response.sendRedirect(http://auth.gulimall.com/login.html);return false;}}
}OrderConfirmVo
public class OrderConfirmVo {Setter GetterListMemberAddressVo address;Setter GetterListOrderItemVo items;Setter GetterInteger integration;public Integer getCount(){Integer i0;if(items!null){for (OrderItemVo item : items) {iitem.getCount();}}return i;}//防重令牌Setter GetterString orderToken;Setter GetterMapLong,Boolean stocks;BigDecimal total;public BigDecimal getTotal() {BigDecimal sum new BigDecimal(0);if(items!null){for (OrderItemVo item : items) {BigDecimal multiply item.getPrice().multiply(new BigDecimal(item.getCount().toString()));sum sum.add(multiply) ;}}totalsum;return sum;}BigDecimal payPrice;public BigDecimal getPayPrice() {payPrice getTotal();return getTotal();}
} confirmOrder() Overridepublic OrderConfirmVo confirmOrder() {RequestAttributes attributes RequestContextHolder.getRequestAttributes();OrderConfirmVo confirmVo new OrderConfirmVo();MemberResponseVo memberResponseVo LoginUserInterceptor.loginUser.get();CompletableFutureVoid getAddressFuture CompletableFuture.runAsync(() - {//1.运程查询所有的收货地址RequestContextHolder.setRequestAttributes(attributes);ListMemberAddressVo address memberFeignService.getAddress(memberResponseVo.getId());confirmVo.setAddress(address);}, executor);CompletableFutureVoid cartFuture CompletableFuture.runAsync(() - {//2.运程查询购物车所有选中的购物项RequestContextHolder.setRequestAttributes(attributes);ListOrderItemVo items cartFeignService.getCurrentUserCartItems();confirmVo.setItems(items);}, executor).thenRunAsync(()-{ListOrderItemVo items confirmVo.getItems();ListLong collect items.stream().map(item - item.getSkuId()).collect(Collectors.toList());R hashStock wmsFeignService.getSkuHashStock(collect);ListSkuStockVo data hashStock.getData(new TypeReferenceListSkuStockVo() {});if(data!null){MapLong, Boolean map data.stream().collect(Collectors.toMap(SkuStockVo::getSkuId, SkuStockVo::getHasStock));confirmVo.setStocks(map);}},executor);//3.查询用户积分Integer integration memberResponseVo.getIntegration();confirmVo.setIntegration(integration);//其他数据自动调用//todo 防重令牌try {CompletableFuture.allOf(cartFuture,getAddressFuture).get();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}return confirmVo;}