Showing
3 changed files
with
141 additions
and
0 deletions
业务分享/查询购物车接口业务逻辑.md
0 → 100644
1 | +查询购物车接口业务逻辑 | ||
2 | +------ | ||
3 | +## 一、入口和返回 | ||
4 | +### 1.入口 | ||
5 | + method=app.Shopping.add,参数:uid、sale_channel、shopping_key,皆非必选参数,通常传uid或shopping_key | ||
6 | + postman调用示例: | ||
7 | + http://192.168.102.205:8080/gateway?method=app.Shopping.cart&uid=8041834&debug=XYZ | ||
8 | + 该接口由类com.yoho.gateway.controller.order.shopping的cart方法实现 | ||
9 | + @RequestMapping(params = "method=app.Shopping.cart") | ||
10 | + @ResponseBody | ||
11 | + public ApiResponse cart(HttpServletRequest httpServletRequest,\n | ||
12 | + @RequestParam(value = "sale_channel", required = false) String saleChannel, | ||
13 | + @RequestParam(value = "uid", required = false) Integer uid,\n | ||
14 | + @RequestParam(value = "shopping_key", required = false) String shoppingKey) | ||
15 | +### 2.返回 | ||
16 | + 主要分两类数据,预售商品和普通商品,因这两类数据是分开结算的。每类数据包括:促销信息和结算费用,各商品详情等。 | ||
17 | +## 二、服务调用 | ||
18 | + 该接口会调用order模块的cartShopping服务,该服务会实现具体的查询业务。而该服务具体执行过程中会调用商品和促销模块的相关服务 | ||
19 | +## 三、具体实现逻辑 | ||
20 | + 1.进入gateway模块的com.yoho.gateway.controller.order.shopping.cart()方法 | ||
21 | + 2.cart方法调用order.cartShopping服务 | ||
22 | + 3.进入order模块的com.yoho.yhorder.shopping.restapi.ShoppingCartController.query()方法,该方法提供order.cartShopping服务 | ||
23 | + 4.query方法调用com.yoho.yhorder.shopping.service.impl.ShoppingCartServiceImpl.query()方法。 | ||
24 | + 5.再调用com.yoho.yhorder.shopping.service.impl.ShoppingCartQueryService.query()方法, | ||
25 | + 6.在ShoppingCartQueryService.query()方法中开始进行业务操作,先进行普通商品算费,再进行预售商品算费,然后将两类结果包装到ShoppingQueryResponse中返回。具体如下: | ||
26 | + 普通商品算费: | ||
27 | + 1)构建算费参数对象ChargeParam,设置CartType=ORDINARY_CART_TYPE、ChargeType=ORDINARY_CHARGE_TYPE。 | ||
28 | + 2)生成算费上下文ChargeContext ordinaryChargeContext | ||
29 | + 3)调用ChargerService.charge()进行算费,算费结果在ChargeContext对象的ChargeTotal中 | ||
30 | + 4)从ChargeContext中取出结果信息ShoppingChargeResult ordinaryChargeResult。 | ||
31 | + 预售商品算费: | ||
32 | + 1)生成预售商品算费上下文ChargeContext preSaleChargeContext | ||
33 | + 2)构建预售商品算费对象(CartType=PRESALE_CART_TYPE、ChargeType=ADVANCE_CHARGE_TYPE)并设置到上下文preSaleChargeContext中,同时将商品列表(从ordinaryChargeContext获取)和用户信息保存上下文中。\n | ||
34 | + 3)调用ChargerService.charge()进行算费。 | ||
35 | + 4)从preSaleChargeContext取出结果信息ShoppingChargeResult preSaleChargeResult | ||
36 | + 由ordinaryChargeResult和preSaleChargeResult构造结果ShoppingQueryResponse response,并返回。 | ||
37 | + | ||
38 | +### 在ShoppingCartQueryService.query()中涉及到两个公共的业务:构建算费上下文和算费。具体实现见后续文档 |
业务分享/算费上下文ChargeContext构建具体过程.md
0 → 100644
1 | +算费上下文ChargeContext构建具体过程 | ||
2 | +---- | ||
3 | +### ChargeContext由ChargeContextFactory.build()构建,参数:Boolean selected、ChargeParam, | ||
4 | +### ChargeContext需要构建的信息: | ||
5 | + 用户信息:vip、当月订单数、有货币、红包 | ||
6 | + 购物车中商品的详情:价格,是否货到付款,是否下架,outlet、促销信息等 | ||
7 | +### 具体实现过程: | ||
8 | + 根据ChargeParam中的List<ShoppingItem>是否为空类进行不同的构建过程. | ||
9 | + 如果为空则调用buildByShoppingCart通过购物车构建。 | ||
10 | + 如果不为空,则是立即购物,通过buildByShoppingItems进行构建。 | ||
11 | +### buildByShoppingCart构建过程如下: | ||
12 | + 1)通过ChargeParam中的uid和shoppingkey找到购物车对象ShoppingCart,为空则抛异常。 | ||
13 | + 如果uid>0,通过uid到数据库表shoppingCart查询到物车对象ShoppingCart | ||
14 | + 如果uid<=0再通过shoppingkey,到数据库表shoppingCart查询到物车对象ShoppingCart。 | ||
15 | + 2)根据ShoppingCart设置ChargeParam的属性(uid,shoppingkey,shoppingcarid) | ||
16 | + 因为uid或shoppingkey可能有一个为空,所以查询到购物车后统一更新这两个值 | ||
17 | + 3)查询设置商品的详细信息List<ShoppingCartItems> shoppingCartGoodsList。 | ||
18 | + 根据shoppingCartId到数据库表shopping_cart_items中 | ||
19 | + 查询当前购物车中商品的信息List<ShoppingCartItems> goodsList。 | ||
20 | + 从goodsList获取到skns、skus | ||
21 | + 根据skns到商品模块查询到商品的详细信息 | ||
22 | + 然后将商品的各种信息(价格,是否货到付款,是否下架,outlet等保存到good的extmap中) | ||
23 | + 根据skns到促销模块查询商品的购买数量限制信息,并设置good的购买限制, | ||
24 | + 根据good的促销id查询促销信息(先到缓存,再到数据库中查询) | ||
25 | + 根据促销信息设置good的promotion_type和real_price、last_Price | ||
26 | + promotion_type=Gift为赠品,real和last Price为0, | ||
27 | + promotion_type=Needpaygift为加价购商品,real和last Price为add_cost, | ||
28 | + 4)根据ChargeParam和shoppingCartGoodsList调用doBuild()构建ChargeContext并返回 | ||
29 | + 将shoppingCartGoodsList转换成List<ChargeGoods>(利用反射将map中的属性设置到ChargeGoods中) | ||
30 | + 并将List<ChargeGoods>保存到ChargeContext。 | ||
31 | + 根据uid到用户模块和数据获取各种相关信息,并保持到UserInfo中。 | ||
32 | + 调用users.getVipSimpleInfo服务,获取用户的vip信息。 | ||
33 | + 到order表查询用户当月点单数。 | ||
34 | + 调用users.getYohoCoin服务,获取用户的有货币信息,并转化成货币。 | ||
35 | + 调用users.selectRedenvelopesCount服务,获取用户的红包, | ||
36 | + 将UserInfo保存到ChargeContext中。 | ||
37 | +### buildByShoppingItems构建过程: | ||
38 | + 1)首先将ChargeParam中的List<ShoppingItem>转换为List<ShoppingCartItems> | ||
39 | + 2)下面的处理和buildByShoppingCart中通过购物车ShoppingCartid到数据库查到 | ||
40 | + List<ShoppingCartItems> goodsList后的处理过程相同 | ||
41 | + | ||
42 | + |
业务分享/购物车算费.md
0 → 100644
1 | +购物车算费过程 | ||
2 | +-------- | ||
3 | +### 算费结果在context对象的ChargeTotal中,调用ChargerService.charge(context). | ||
4 | +### 1.docharge进行算费 | ||
5 | + #### 1.1对商品进行分类, | ||
6 | + 1.1.1 遍历ChargeContext中的chargeGoodsList, | ||
7 | + 首先判断是否下架,再根据是否是预售,结果存入preOffShelvesGoods或offShelvesGoods中。 | ||
8 | + 根据库存信息,判断是否售罄,结果存入offShelvesGoods或soldOutGoods中。 | ||
9 | + 根据chargeGoods信息,进行分类。(promotion id > 0, 说明是赠品或加价购商品,PromotionType=gift则是mainGoodsGift,否则是mainGoodsPriceGift。) | ||
10 | + 共分为:mainGoodsGift、mainGoodsPriceGift、advanceGoods、outletGoods、mainGoods。 | ||
11 | + 如果购物车类型是预售,则mainGoods=advanceGoods(预售购物车只取mainGoods类别) | ||
12 | + 设置jit信息,goodlist中只要有一个是jit则,设置ChargeParam的IsJit为true。 | ||
13 | + #### 1.2进行初始化算费,调用InitCharge.charge方法,计算普通商品的总价和运费 | ||
14 | + 遍历maingoods, | ||
15 | + 计算maingoods的购买数量goodsCount, | ||
16 | + 计算已选maingoods的购买数量selectedGoodsCount | ||
17 | + 计算已选且不是赠品和加价购商品的总价orderAmount | ||
18 | + 从ChargeParam中取得是否需要运费(默认不需要)以及是否加急等,计算运费(普通10元,加急加5元)。 | ||
19 | + 将以上信息保存到ChargeTotal中并设置到chargeContext中 | ||
20 | + #### 1.3从ChargeParam中获取chargeType | ||
21 | + #### 1.4根据chargeType执行对应的操作(分别是普通商品、预售产品、限购商品、计算优惠券可用不可用) | ||
22 | + ORDINARY普通商品: | ||
23 | + 调用doOrdinaryCharge(chargeContext)进行具体算费。 | ||
24 | + 1.4.1异步调用货到付款信息 | ||
25 | + 1.4.2mainGoodsVIP算费,调用vipCharge.charge方法。 | ||
26 | + 如果用户每个月订单数量大于阈值,则不享受VIP的优惠,返回。 | ||
27 | + 计算优惠信息,优惠后价格、优惠比例: | ||
28 | + 遍历mainGoodsList,特价商品不享受vip,获取商品的折扣信息, | ||
29 | + 1-正常折扣 | ||
30 | + 根据用户等级获取折扣量进行计算。 | ||
31 | + 2-统一9.5折 | ||
32 | + 3-无折扣 | ||
33 | + 4-统一vip价 | ||
34 | + 5-vip自定价 | ||
35 | + 根据用户等级进行计算 | ||
36 | + 如果发生了优惠则设置good的Real_price、Real_vip_price、Real_vip_price、优惠比例、优惠金额Vip_discount_money | ||
37 | + 如果是选择的商品,将优惠总额加到total中VipCutdownAmount上。 | ||
38 | + 1.4.3计算outlets,调用outletsCharge.charge方法, | ||
39 | + 遍历OutletGoods, | ||
40 | + 取good的Real_price设置good的Real_price、Last_price | ||
41 | + 计算outletAmount总价。 | ||
42 | + 如果总价outletAmount大于阈值,则享受9折优惠,遍历OutletGoods设置每个商品的新的价格,并将优惠总额加到total中VipCutdownAmount上,同时在chargeTotal.PromotionFormulaList中加入outlet优惠信息。 | ||
43 | + 1.4.4计算促销,promotionCharge.charge方法, | ||
44 | + 获取所有促销信息,遍历促销信息,根据促销类型多态调用compute方法计算(具体计算比较复杂以后再详细描述)是否匹配优惠,如果匹配则设置good的相关信息。 | ||
45 | + 1.4.5计算优惠券 | ||
46 | + 根据ChargeParam中的conponCode远程调用促销模块的信息取到优惠卷的信息,如果没有优惠码则不计算返回。 | ||
47 | + 根据优惠券的信息与mainGoods进行匹配计算,如果匹配则设置good和chargeTotal的相关信息。 | ||
48 | + | ||
49 | + 1.4.6购物车计算 | ||
50 | + 对普通商品、gift,priceGift,outlet分别计算费用,并累加存入total中。 | ||
51 | + 1.4.7根据优惠(优惠券、红包、运费等)计算最后价格 | ||
52 | + 1.4.8是否可货到付款判断 | ||
53 | + 预售产品、限购商品、计算优惠券可用不可用(未完待续) | ||
54 | + | ||
55 | + | ||
56 | + | ||
57 | + | ||
58 | + | ||
59 | + | ||
60 | + | ||
61 | + |
-
Please register or login to post a comment