购物车思维导图
2023-03-23 18:26:36 1 举报
AI智能生成
购物车思维导图
作者其他创作
大纲/内容
业务特殊说明
通过缓存数据需要重新获取商品及活动等信息
isQueryAllSku = true
isQueryAllSku = true
查询购物车信息
支付成功清空购物车
查询购物车数量
脑图说明
加入购物车逻辑最全,其他功能概要说明的可以查看加入购物车功能
公共功能说明
获取购物车信息
获取购物车信息
获取参数
customerId
distributorId
selfPickupId
isQueryAllSku:false
是否重新查询全部商品 true-是 false-否
方法名称
getUserOrderCart
业务逻辑
1 查询缓存信息
1 先从缓存中获取
参数
用户ID + 团长ID
redis_key
order_cart:用户ID + ":" + 团长ID
2 缓存不存从DB中获取
查询参数
用户ID + 团长ID
如果DB存在
放入缓存并设置过期时间30天
3 DB不存在直接返回空
4 异常直接从DB获取不会放入缓存
2 判断购物车是否有无效数据
购物车数据为空不设置
如果存在无效数据,设置isQueryAllSku=true
3 判断是否是缓存获取
如果非缓存获取,并且DB有值,则需要重新获取商品其他信息
4 如果非缓存获取,则获取商品其他信息
获取商品信息
调用商品搜索服务批量获取商品信息(ES)
itemIDs(stockIds)
服务:fs-search/goods/search
查询库存信息
调用库存服务获取商品上架SKU库存信息
服务:fs-b-yinglong/goodsSaleStock/getOnSaleSkuStock
查询限领数量
查询购物车商品列表的商品还能购买数量
通过redis获取
每个分拣仓和用户每天一个缓存记录
redis_key:
order:sku:purnum:" + today + ":sid:" + storeId + ":cid:" + customerId
过期时间
到第二天0点过期
数据类型:Map类型
key:skuId
value:购买限制
查询活动信息
购物车查询专享活动的商品
专享活动信息
活动价格信息(商品id:商品专享价)
各个商品活动信息
专享价格
限购数量
服务:fs-activity/exclusive/detail4OrderCart
获取活动限购
通过redis获取活动商品购买数量
类型:新人专享商品
通过redis获取
活动商品购买数量
redis_key:
order:act:sku:purnum:" + 新人专享商品.value + ":cid:" + customerId
过期时间
订单支付超时时间 + 1小时
数据类型:Map类型
根据上面获取的信息循环设置设置购物车信息
设置商品信息
下架或者商品没价格-会设置购物车商品未选中
设置库存信息
库存为0
会设置购物车状态为无效
购物车商品为未选中
有库存
设置购物车状态为有效
设置购物车当日商品限购剩余数量
限购剩余数量= 商品限购数 - 用户购买数
无限购则设置最大
设置转化活动-即新人活动信息
活动信息为空
设置商品售卖类型
普通商品
活动不为空
设置商品售卖类型
新人专享商品
设置活动信息
活动ID、开始结束时间、活动价格、活动限购数量
如果非活动商品、并且不是新人的情况
设置活动信息
活动为不可用
转化活动限购
设置活动剩余数量
设置购物车选中商品总数量
循环计算总数量
1 下架 2 无效 3 未选中 不进行计算
设置购物车选中总价格
循环计算总价格
有活动价、购物车活动有效、新人商品
则按照活动价和售价最小计算
totalAmount = totalAmount + orderCart.getNum() * Integer.min(activityPrice, orderCart.getSellPriceReal().intValue());
非活动价格正常
totalAmount = totalAmount + orderCart.getNum() * orderCart.getSellPriceReal()
设置购物车总数量
循环计算总数量
1 下架 2 无效 不进行计算
设置缓存updateOrderCartCache
redis_key
order_cart: + customerId + ":" + distributorId
过期时间为30天
缓存失败,捕获异常 不做处理
5 如果缓存和DB都无数据直接返回NULL
是否新用户判断
通过用户ID查询ES是否有订单信息
全部退款也不算新用户
查询条件
订单状态为已付款、订单类型不为分享送和抽奖
更新购物车缓存
设置缓存updateOrderCartCache
redis_key
order_cart: + customerId + ":" + distributorId
过期时间为30天
缓存失败,捕获异常 不做处理
异步同步DB
发布消息同步数据库
topic名称
topic-orderCart-serialize
购物车同步数据库开关
order.cart.queue.flag:true
同步流程
先delete数据
delete from order_cart where customer_id=#{customerId} and distributor_id=#{distributorId}
在批量保存数据
batchsave(List<OrderCart>)
create table order_cart
(
id bigint not null comment '主键id'
primary key,
customer_id bigint not null comment '用户id',
distributor_id bigint not null comment '团长id',
item_id bigint not null comment '商品记录唯一ID',
sku_id bigint not null comment 'skuID',
sku_sn varchar(100) null comment 'sku编码',
sku_name varchar(100) null comment 'sku名称',
store_id bigint not null comment '分拣仓ID',
goods_id bigint not null comment '商品ID',
num int default 0 not null comment '商品数量',
snap_price int default 0 not null comment '加入购物车时的售价',
check_status tinyint default 1 not null comment '选中状态 0-未选中 1-选中',
del_flag tinyint default 0 not null,
version int null,
creator varchar(100) null,
create_time timestamp default CURRENT_TIMESTAMP not null,
updater varchar(100) null,
update_time timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
constraint unique_customerId_distributorId_skuId_storeId
unique (customer_id, distributor_id, sku_id, store_id)
)
comment '购物车表';
create index idx_customerId_distributorId_itemId
on order_cart (customer_id, distributor_id, item_id);
(
id bigint not null comment '主键id'
primary key,
customer_id bigint not null comment '用户id',
distributor_id bigint not null comment '团长id',
item_id bigint not null comment '商品记录唯一ID',
sku_id bigint not null comment 'skuID',
sku_sn varchar(100) null comment 'sku编码',
sku_name varchar(100) null comment 'sku名称',
store_id bigint not null comment '分拣仓ID',
goods_id bigint not null comment '商品ID',
num int default 0 not null comment '商品数量',
snap_price int default 0 not null comment '加入购物车时的售价',
check_status tinyint default 1 not null comment '选中状态 0-未选中 1-选中',
del_flag tinyint default 0 not null,
version int null,
creator varchar(100) null,
create_time timestamp default CURRENT_TIMESTAMP not null,
updater varchar(100) null,
update_time timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
constraint unique_customerId_distributorId_skuId_storeId
unique (customer_id, distributor_id, sku_id, store_id)
)
comment '购物车表';
create index idx_customerId_distributorId_itemId
on order_cart (customer_id, distributor_id, item_id);
刷新购物车
刷新购物车当前商品信息
重新设置商品信息
通过ES获取当前商品信息
如果为卡券商品则抛异常
如果不为空,则重新设置该购物车商品信息
重新设置库存信息
重新设置当日商品限购剩余数量
如果是新用户专享商品,重新设置活动信息
重新设置活动限购信息
方法名:refreshOrderCartInfo
活动信息校验
活动商品校验
如果非新人,或者非新人活动商品
设置当前购物车商品
活动不可用
商品信息校验
新增一个商品数量校验
是否下架
是否购物车商品是否有效
CHECK_STATUS_INVALID
当前数量是否大于库存数据量
价格是否有效
添加类型判断如果有活动,活动数量是否大于活动限购数量
判断是否大于每天用户限购数量
分支主题
加入购物车
服务信息
fc-customer
addToCart
参数信息
@ApiModelProperty(value = "用户ID", example = "0")
private Long customerId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private Long itemId;
@ApiModelProperty(value = "SKU ID", example = "0")
private Long skuId;
@ApiModelProperty(value = "仓ID", example = "0")
private Long storeId;
@ApiModelProperty(value = "商品ID", example = "0")
private Long goodsId;
@ApiModelProperty(value = "商品版本", example = "0")
private Integer goodsVersion;
@ApiModelProperty(value = "促销活动ID", example = "0")
private Long promotionId;
@ApiModelProperty(value = "SKU购买数量", example = "0")
private Integer num = 0;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
@ApiModelProperty("下单时售价")
private Integer sellPrice;
@ApiModelProperty("活动商品数量")
private Integer activityGoodsNum = 0;
@ApiModelProperty("活动商品价格")
private Integer activityGoodsPrice = 0;
@ApiModelProperty("秒杀活动id")
private Long seckillId;
private Long customerId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private Long itemId;
@ApiModelProperty(value = "SKU ID", example = "0")
private Long skuId;
@ApiModelProperty(value = "仓ID", example = "0")
private Long storeId;
@ApiModelProperty(value = "商品ID", example = "0")
private Long goodsId;
@ApiModelProperty(value = "商品版本", example = "0")
private Integer goodsVersion;
@ApiModelProperty(value = "促销活动ID", example = "0")
private Long promotionId;
@ApiModelProperty(value = "SKU购买数量", example = "0")
private Integer num = 0;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
@ApiModelProperty("下单时售价")
private Integer sellPrice;
@ApiModelProperty("活动商品数量")
private Integer activityGoodsNum = 0;
@ApiModelProperty("活动商品价格")
private Integer activityGoodsPrice = 0;
@ApiModelProperty("秒杀活动id")
private Long seckillId;
业务逻辑
1 调用购物车服务-加入购物车
服务信息
fs-ordercart
addToCart
业务逻辑
1 是否新用户判断
通过用户ID查询ES是否有订单信息
全部退款也不算新用户
查询条件
订单状态为已付款、订单类型不为分享送和抽奖
2 获取购物车信息
获取参数
customerId
distributorId
selfPickupId
isQueryAllSku:false
是否重新查询全部商品 true-是 false-否
方法名称
getUserOrderCart
业务逻辑
1 查询缓存信息
1 先从缓存中获取
参数
用户ID + 团长ID
redis_key
order_cart:用户ID + ":" + 团长ID
2 缓存不存从DB中获取
查询参数
用户ID + 团长ID
如果DB存在
放入缓存并设置过期时间30天
3 DB不存在直接返回空
4 异常直接从DB获取不会放入缓存
2 判断购物车是否有无效数据
购物车数据为空不设置
如果存在无效数据,设置isQueryAllSku=true
3 判断是否是缓存获取
如果非缓存获取,并且DB有值,则需要重新获取商品其他信息
4 如果非缓存获取,则获取商品其他信息
获取商品信息
调用商品搜索服务批量获取商品信息(ES)
itemIDs(stockIds)
服务:fs-search/goods/search
查询库存信息
调用库存服务获取商品上架SKU库存信息
服务:fs-b-yinglong/goodsSaleStock/getOnSaleSkuStock
查询限领数量
查询购物车商品列表的商品还能购买数量
通过redis获取
每个分拣仓和用户每天一个缓存记录
redis_key:
order:sku:purnum:" + today + ":sid:" + storeId + ":cid:" + customerId
过期时间
到第二天0点过期
数据类型:Map类型
key:skuId
value:购买限制
查询活动信息
购物车查询专享活动的商品
专享活动信息
活动价格信息(商品id:商品专享价)
各个商品活动信息
专享价格
限购数量
服务:fs-activity/exclusive/detail4OrderCart
获取活动限购
通过redis获取活动商品购买数量
类型:新人专享商品
通过redis获取
活动商品购买数量
redis_key:
order:act:sku:purnum:" + 新人专享商品.value + ":cid:" + customerId
过期时间
订单支付超时时间 + 1小时
数据类型:Map类型
根据上面获取的信息循环设置设置购物车信息
设置商品信息
下架或者商品没价格-会设置购物车商品未选中
设置库存信息
库存为0
会设置购物车状态为无效
购物车商品为未选中
有库存
设置购物车状态为有效
设置购物车当日商品限购剩余数量
限购剩余数量= 商品限购数 - 用户购买数
无限购则设置最大
设置转化活动-即新人活动信息
活动信息为空
设置商品售卖类型
普通商品
活动不为空
设置商品售卖类型
新人专享商品
设置活动信息
活动ID、开始结束时间、活动价格、活动限购数量
如果非活动商品、并且不是新人的情况
设置活动信息
活动为不可用
转化活动限购
设置活动剩余数量
设置购物车选中商品总数量
循环计算总数量
1 下架 2 无效 3 未选中 不进行计算
设置购物车选中总价格
循环计算总价格
有活动价、购物车活动有效、新人商品
则按照活动价和售价最小计算
totalAmount = totalAmount + orderCart.getNum() * Integer.min(activityPrice, orderCart.getSellPriceReal().intValue());
非活动价格正常
totalAmount = totalAmount + orderCart.getNum() * orderCart.getSellPriceReal()
设置购物车总数量
循环计算总数量
1 下架 2 无效 不进行计算
设置缓存updateOrderCartCache
redis_key
order_cart: + customerId + ":" + distributorId
过期时间为30天
缓存失败,捕获异常 不做处理
5 如果缓存和DB都无数据直接返回NULL
3 获取购物车商品信息
如果商品信息 > 100(apollo配置)
提示超过购物车最大限制
4 从购物车缓存中获取当前添加的商品信息
唯一商品ID-itemID
skuId + "_" + storeId
5 判断缓存是否存
1 如果缓存中存在商品信息,则调整库存并返回
方法名称:increaseOrDecreaseCartSku
@ApiModelProperty(value = "用户ID", example = "0")
private Long customerId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private Long itemId;
@ApiModelProperty("增加/减少")
private OrderCartNumType orderCartNumType;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
private Long customerId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private Long itemId;
@ApiModelProperty("增加/减少")
private OrderCartNumType orderCartNumType;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
直接调整购物车商品数量
1 获取一遍是否为新用户
2 获取一遍购物车缓存信息
3 通过缓存信息获取该商品信息
4 根据加减类型进行数量调整
5 刷新购物车当前商品信息
重新设置商品信息
通过ES获取当前商品信息
如果为卡券商品则抛异常
如果不为空,则重新设置该购物车商品信息
重新设置库存信息
重新设置当日商品限购剩余数量
如果是新用户专享商品,重新设置活动信息
重新设置活动限购信息
方法名:refreshOrderCartInfo
6 活动商品校验
如果非新人,或者非新人活动商品
设置当前购物车商品
活动不可用
7 变更数量是否大于0
为0
则从购物车商品列表中移除
不为0
新增一个商品数量校验
是否下架
是否购物车商品是否有效
CHECK_STATUS_INVALID
当前数量是否大于库存数据量
价格是否有效
添加类型判断如果有活动,活动数量是否大于活动限购数量
判断是否大于每天用户限购数量
数据校验成功
则设置商品为新数据量
重新计算总数和全选状态
设置购物车选中商品总数量
循环计算总数量
1 下架 2 无效 3 未选中 不进行计算
设置购物车选中总价格
循环计算总价格
有活动价、购物车活动有效、新人商品
则按照活动价和售价最小计算
totalAmount = totalAmount + orderCart.getNum() * Integer.min(activityPrice, orderCart.getSellPriceReal().intValue());
非活动价格正常
totalAmount = totalAmount + orderCart.getNum() * orderCart.getSellPriceReal()
设置购物车总数量
循环计算总数量
1 下架 2 无效 不进行计算
更新购物车缓存
设置缓存updateOrderCartCache
redis_key
order_cart: + customerId + ":" + distributorId
过期时间为30天
缓存失败,捕获异常 不做处理
发布消息同步数据库
topic名称
topic-orderCart-serialize
购物车同步数据库开关
order.cart.queue.flag:true
同步流程
先delete数据
delete from order_cart where customer_id=#{customerId} and distributor_id=#{distributorId}
在批量保存数据
batchsave(List<OrderCart>)
create table order_cart
(
id bigint not null comment '主键id'
primary key,
customer_id bigint not null comment '用户id',
distributor_id bigint not null comment '团长id',
item_id bigint not null comment '商品记录唯一ID',
sku_id bigint not null comment 'skuID',
sku_sn varchar(100) null comment 'sku编码',
sku_name varchar(100) null comment 'sku名称',
store_id bigint not null comment '分拣仓ID',
goods_id bigint not null comment '商品ID',
num int default 0 not null comment '商品数量',
snap_price int default 0 not null comment '加入购物车时的售价',
check_status tinyint default 1 not null comment '选中状态 0-未选中 1-选中',
del_flag tinyint default 0 not null,
version int null,
creator varchar(100) null,
create_time timestamp default CURRENT_TIMESTAMP not null,
updater varchar(100) null,
update_time timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
constraint unique_customerId_distributorId_skuId_storeId
unique (customer_id, distributor_id, sku_id, store_id)
)
comment '购物车表';
create index idx_customerId_distributorId_itemId
on order_cart (customer_id, distributor_id, item_id);
(
id bigint not null comment '主键id'
primary key,
customer_id bigint not null comment '用户id',
distributor_id bigint not null comment '团长id',
item_id bigint not null comment '商品记录唯一ID',
sku_id bigint not null comment 'skuID',
sku_sn varchar(100) null comment 'sku编码',
sku_name varchar(100) null comment 'sku名称',
store_id bigint not null comment '分拣仓ID',
goods_id bigint not null comment '商品ID',
num int default 0 not null comment '商品数量',
snap_price int default 0 not null comment '加入购物车时的售价',
check_status tinyint default 1 not null comment '选中状态 0-未选中 1-选中',
del_flag tinyint default 0 not null,
version int null,
creator varchar(100) null,
create_time timestamp default CURRENT_TIMESTAMP not null,
updater varchar(100) null,
update_time timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
constraint unique_customerId_distributorId_skuId_storeId
unique (customer_id, distributor_id, sku_id, store_id)
)
comment '购物车表';
create index idx_customerId_distributorId_itemId
on order_cart (customer_id, distributor_id, item_id);
2 如果缓存无当前商品信息
1 创建新的购物车商品
新加入的商品默认是活动商品 这样才会去查活动信息
新人专享商品
2 刷新购物车当前商品信息
重新设置商品信息
通过ES获取当前商品信息
如果为卡券商品则抛异常
如果不为空,则重新设置该购物车商品信息
重新设置库存信息
重新设置当日商品限购剩余数量
如果是新用户专享商品,重新设置活动信息
重新设置活动限购信息
方法名:refreshOrderCartInfo
3 验证虚拟商品、线上卡券、线下卡券
如果是抛异常
提示虚拟、卡券商品无法加入购物车
4 活动商品校验
非首单、活动信息为空、活动结束时间小于当前时间
设置活动不可用
5 新增一个商品数量校验
是否下架
是否购物车商品是否有效
CHECK_STATUS_INVALID
当前数量是否大于库存数据量
价格是否有效
添加类型判断如果有活动,活动数量是否大于活动限购数量
判断是否大于每天用户限购数量
6 检验成功
1 设置数量1
2 默认为选中
3 重新计算总数量及金额
4 更新购物车缓存
设置缓存updateOrderCartCache
redis_key
order_cart: + customerId + ":" + distributorId
过期时间为30天
缓存失败,捕获异常 不做处理
5 发布消息同步数据库
topic名称
topic-orderCart-serialize
购物车同步数据库开关
order.cart.queue.flag:true
同步流程
先delete数据
delete from order_cart where customer_id=#{customerId} and distributor_id=#{distributorId}
在批量保存数据
batchsave(List<OrderCart>)
create table order_cart
(
id bigint not null comment '主键id'
primary key,
customer_id bigint not null comment '用户id',
distributor_id bigint not null comment '团长id',
item_id bigint not null comment '商品记录唯一ID',
sku_id bigint not null comment 'skuID',
sku_sn varchar(100) null comment 'sku编码',
sku_name varchar(100) null comment 'sku名称',
store_id bigint not null comment '分拣仓ID',
goods_id bigint not null comment '商品ID',
num int default 0 not null comment '商品数量',
snap_price int default 0 not null comment '加入购物车时的售价',
check_status tinyint default 1 not null comment '选中状态 0-未选中 1-选中',
del_flag tinyint default 0 not null,
version int null,
creator varchar(100) null,
create_time timestamp default CURRENT_TIMESTAMP not null,
updater varchar(100) null,
update_time timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
constraint unique_customerId_distributorId_skuId_storeId
unique (customer_id, distributor_id, sku_id, store_id)
)
comment '购物车表';
create index idx_customerId_distributorId_itemId
on order_cart (customer_id, distributor_id, item_id);
(
id bigint not null comment '主键id'
primary key,
customer_id bigint not null comment '用户id',
distributor_id bigint not null comment '团长id',
item_id bigint not null comment '商品记录唯一ID',
sku_id bigint not null comment 'skuID',
sku_sn varchar(100) null comment 'sku编码',
sku_name varchar(100) null comment 'sku名称',
store_id bigint not null comment '分拣仓ID',
goods_id bigint not null comment '商品ID',
num int default 0 not null comment '商品数量',
snap_price int default 0 not null comment '加入购物车时的售价',
check_status tinyint default 1 not null comment '选中状态 0-未选中 1-选中',
del_flag tinyint default 0 not null,
version int null,
creator varchar(100) null,
create_time timestamp default CURRENT_TIMESTAMP not null,
updater varchar(100) null,
update_time timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
constraint unique_customerId_distributorId_skuId_storeId
unique (customer_id, distributor_id, sku_id, store_id)
)
comment '购物车表';
create index idx_customerId_distributorId_itemId
on order_cart (customer_id, distributor_id, item_id);
2 设置购物车其他字段信息
1 购物车商品优惠券列表
优惠券信息按照商品分组
2 购物车选中合计
总金额-优惠券总金额-成长活动总金额
成长活动信息调用活动服务获取
fs-activity
判断用户是否满足成长活动条件
获取成长活动信息
调用订单服务获取用户已购买的活动商品数量
获取活动剩余数量
剩余数量 = 活动数量 - 已购活动数量
循环处理购物车商品信息
判断购物车商品是否满足活动条件
如果满足并且剩余数量>0
设置购物车商品活动信息
包括可以活动数量
活动相关信息
返回最终活动剩余数量
剩余数量 = 活动数量 - 已购活动数量 - 购物车商品已用数量
优惠券信息调用优惠券服务获取
fs-promotion
3 已经优惠的金额
优惠券总金额+成长活动总金额
4 购物车商品信息
有效商品信息
5 购物车失效商品信息
无效商品信息
根据价格是否为空、商品上架状态、失效状态、库存数量
查询购物车
服务信息
fc-customer
queryUserCart
参数信息
distributorId
selfPickupId
cityId
selfPickupId
cityId
业务逻辑
1 查询本地缓存
1 热配开关JdHotKeyStore
cartListHotKeyFlag:true
2 key
StrUtil.join("-", "CART_LIST", userToken.getIdentityId(), distributorId, selfPickupId, cityId)
2 本地缓存是否存在数据
存在
直接返回缓存数据
不存在
1 调用购物车服务-查询购物车
服务信息
fs-ordercart
queryUserCart
业务逻辑
获取购物车信息
获取参数
customerId
distributorId
selfPickupId
isQueryAllSku:true
是否重新查询全部商品 true-是 false-否
方法名称
getUserOrderCart
业务逻辑
1 查询缓存信息
1 先从缓存中获取
参数
用户ID + 团长ID
redis_key
order_cart:用户ID + ":" + 团长ID
2 缓存不存从DB中获取
查询参数
用户ID + 团长ID
如果DB存在
放入缓存并设置过期时间30天
3 DB不存在直接返回空
4 异常直接从DB获取不会放入缓存
2 判断购物车是否有无效数据
购物车数据为空不设置
如果存在无效数据,设置isQueryAllSku=true
3 判断是否是缓存获取
如果非缓存获取,并且DB有值,则需要重新获取商品其他信息
4 如果非缓存获取,则获取商品其他信息
获取商品信息
调用商品搜索服务批量获取商品信息(ES)
itemIDs(stockIds)
服务:fs-search/goods/search
查询库存信息
调用库存服务获取商品上架SKU库存信息
服务:fs-b-yinglong/goodsSaleStock/getOnSaleSkuStock
查询限领数量
查询购物车商品列表的商品还能购买数量
通过redis获取
每个分拣仓和用户每天一个缓存记录
redis_key:
order:sku:purnum:" + today + ":sid:" + storeId + ":cid:" + customerId
过期时间
到第二天0点过期
数据类型:Map类型
key:skuId
value:购买限制
查询活动信息
购物车查询专享活动的商品
专享活动信息
活动价格信息(商品id:商品专享价)
各个商品活动信息
专享价格
限购数量
服务:fs-activity/exclusive/detail4OrderCart
获取活动限购
通过redis获取活动商品购买数量
类型:新人专享商品
通过redis获取
活动商品购买数量
redis_key:
order:act:sku:purnum:" + 新人专享商品.value + ":cid:" + customerId
过期时间
订单支付超时时间 + 1小时
数据类型:Map类型
根据上面获取的信息循环设置设置购物车信息
设置商品信息
下架或者商品没价格-会设置购物车商品未选中
设置库存信息
库存为0
会设置购物车状态为无效
购物车商品为未选中
有库存
设置购物车状态为有效
设置购物车当日商品限购剩余数量
限购剩余数量= 商品限购数 - 用户购买数
无限购则设置最大
设置转化活动-即新人活动信息
活动信息为空
设置商品售卖类型
普通商品
活动不为空
设置商品售卖类型
新人专享商品
设置活动信息
活动ID、开始结束时间、活动价格、活动限购数量
如果非活动商品、并且不是新人的情况
设置活动信息
活动为不可用
转化活动限购
设置活动剩余数量
设置购物车选中商品总数量
循环计算总数量
1 下架 2 无效 3 未选中 不进行计算
设置购物车选中总价格
循环计算总价格
有活动价、购物车活动有效、新人商品
则按照活动价和售价最小计算
totalAmount = totalAmount + orderCart.getNum() * Integer.min(activityPrice, orderCart.getSellPriceReal().intValue());
非活动价格正常
totalAmount = totalAmount + orderCart.getNum() * orderCart.getSellPriceReal()
设置购物车总数量
循环计算总数量
1 下架 2 无效 不进行计算
设置缓存updateOrderCartCache
redis_key
order_cart: + customerId + ":" + distributorId
过期时间为30天
缓存失败,捕获异常 不做处理
5 如果缓存和DB都无数据直接返回NULL
2 设置购物车其他字段信息
1 购物车商品优惠券列表
优惠券信息按照商品分组
2 购物车选中合计
总金额-优惠券总金额-成长活动总金额
成长活动信息调用活动服务获取
fs-activity
优惠券信息调用优惠券服务获取
fs-promotion
3 已经优惠的金额
优惠券总金额+成长活动总金额
4 购物车商品信息
有效商品信息
5 购物车失效商品信息
无效商品信息
根据价格是否为空、商品上架状态、失效状态、库存数量
3 设置本地缓存
JdHotKeyStore.smartSet(StrUtil.join("-", KEY_CART_LIST_PREFIX, userToken.getIdentityId(), distributorId, selfPickupId, cityId), orderCartCache);
增加/减少商品数量
服务信息
fc-customer
increaseOrDecreaseCartSku
参数信息
@ApiModelProperty(value = "用户ID", example = "0")
private Long customerId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private Long itemId;
@ApiModelProperty("增加/减少")
private OrderCartNumType orderCartNumType;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
private Long customerId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private Long itemId;
@ApiModelProperty("增加/减少")
private OrderCartNumType orderCartNumType;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
业务逻辑
1 调用购物车服务-增加/减少商品数量
服务信息
fs-ordercart
increaseOrDecreaseCartSku
业务逻辑
直接调整购物车商品数量
1 获取一遍是否为新用户
2 获取一遍购物车缓存信息
3 再次通过缓存信息获取该商品信息
4 根据加减类型进行数量调整
5 刷新购物车当前商品信息
重新设置商品信息
通过ES获取当前商品信息
如果为卡券商品则抛异常
如果不为空,则重新设置该购物车商品信息
重新设置库存信息
重新设置当日商品限购剩余数量
如果是新用户专享商品,重新设置活动信息
重新设置活动限购信息
方法名:refreshOrderCartInfo
6 活动商品校验
如果非新人,或者非新人活动商品
设置当前购物车商品
活动不可用
7 变更数量是否大于0
为0
则从购物车商品列表中移除
不为0
新增一个商品数量校验
是否下架
是否购物车商品是否有效
CHECK_STATUS_INVALID
当前数量是否大于库存数据量
价格是否有效
添加类型判断如果有活动,活动数量是否大于活动限购数量
判断是否大于每天用户限购数量
数据校验成功
则设置商品为新数据量
重新计算总数和全选状态
设置购物车选中商品总数量
循环计算总数量
1 下架 2 无效 3 未选中 不进行计算
设置购物车选中总价格
循环计算总价格
有活动价、购物车活动有效、新人商品
则按照活动价和售价最小计算
totalAmount = totalAmount + orderCart.getNum() * Integer.min(activityPrice, orderCart.getSellPriceReal().intValue());
非活动价格正常
totalAmount = totalAmount + orderCart.getNum() * orderCart.getSellPriceReal()
设置购物车总数量
循环计算总数量
1 下架 2 无效 不进行计算
更新购物车缓存
设置缓存updateOrderCartCache
redis_key
order_cart: + customerId + ":" + distributorId
过期时间为30天
缓存失败,捕获异常 不做处理
发布消息同步数据库
topic名称
topic-orderCart-serialize
购物车同步数据库开关
order.cart.queue.flag:true
同步流程
先delete数据
delete from order_cart where customer_id=#{customerId} and distributor_id=#{distributorId}
在批量保存数据
batchsave(List<OrderCart>)
create table order_cart
(
id bigint not null comment '主键id'
primary key,
customer_id bigint not null comment '用户id',
distributor_id bigint not null comment '团长id',
item_id bigint not null comment '商品记录唯一ID',
sku_id bigint not null comment 'skuID',
sku_sn varchar(100) null comment 'sku编码',
sku_name varchar(100) null comment 'sku名称',
store_id bigint not null comment '分拣仓ID',
goods_id bigint not null comment '商品ID',
num int default 0 not null comment '商品数量',
snap_price int default 0 not null comment '加入购物车时的售价',
check_status tinyint default 1 not null comment '选中状态 0-未选中 1-选中',
del_flag tinyint default 0 not null,
version int null,
creator varchar(100) null,
create_time timestamp default CURRENT_TIMESTAMP not null,
updater varchar(100) null,
update_time timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
constraint unique_customerId_distributorId_skuId_storeId
unique (customer_id, distributor_id, sku_id, store_id)
)
comment '购物车表';
create index idx_customerId_distributorId_itemId
on order_cart (customer_id, distributor_id, item_id);
(
id bigint not null comment '主键id'
primary key,
customer_id bigint not null comment '用户id',
distributor_id bigint not null comment '团长id',
item_id bigint not null comment '商品记录唯一ID',
sku_id bigint not null comment 'skuID',
sku_sn varchar(100) null comment 'sku编码',
sku_name varchar(100) null comment 'sku名称',
store_id bigint not null comment '分拣仓ID',
goods_id bigint not null comment '商品ID',
num int default 0 not null comment '商品数量',
snap_price int default 0 not null comment '加入购物车时的售价',
check_status tinyint default 1 not null comment '选中状态 0-未选中 1-选中',
del_flag tinyint default 0 not null,
version int null,
creator varchar(100) null,
create_time timestamp default CURRENT_TIMESTAMP not null,
updater varchar(100) null,
update_time timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
constraint unique_customerId_distributorId_skuId_storeId
unique (customer_id, distributor_id, sku_id, store_id)
)
comment '购物车表';
create index idx_customerId_distributorId_itemId
on order_cart (customer_id, distributor_id, item_id);
2 设置购物车其他字段信息
1 购物车商品优惠券列表
优惠券信息按照商品分组
2 购物车选中合计
总金额-优惠券总金额-成长活动总金额
成长活动信息调用活动服务获取
fs-activity
优惠券信息调用优惠券服务获取
fs-promotion
3 已经优惠的金额
优惠券总金额+成长活动总金额
4 购物车商品信息
有效商品信息
5 购物车失效商品信息
无效商品信息
根据价格是否为空、商品上架状态、失效状态、库存数量
删除商品
服务信息
fc-customer
deleteCartSku
参数信息
@ApiModelProperty(value = "用户ID", example = "0")
private Long customerId;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private List<Long> itemIds;
private Long customerId;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private List<Long> itemIds;
业务逻辑
1 调用购物车服务-删除商品
1 查询购物车信息
getUserOrderCart
2 获取待删除购物车商品信息
3 移除当前商品信息
4 重新计算总数总价
5 更新缓存
ORDER_CART_KEY + customerId + ":" + distributorId
6 同步数据库
topic-orderCart-serialize
2 设置购物车其他字段信息
1 购物车商品优惠券列表
优惠券信息按照商品分组
2 购物车选中合计
总金额-优惠券总金额-成长活动总金额
成长活动信息调用活动服务获取
fs-activity
优惠券信息调用优惠券服务获取
fs-promotion
3 已经优惠的金额
优惠券总金额+成长活动总金额
4 购物车商品信息
有效商品信息
5 购物车失效商品信息
无效商品信息
根据价格是否为空、商品上架状态、失效状态、库存数量
勾选商品
服务信息
fc-customer
checkCartSku
参数信息
@ApiModelProperty(value = "用户ID", example = "0")
private Long customerId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private Long itemId;
@ApiModelProperty(value = "选中状态 0-未选中 1-选中", example = "0")
private Integer checkStatus;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
private Long customerId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private Long itemId;
@ApiModelProperty(value = "选中状态 0-未选中 1-选中", example = "0")
private Integer checkStatus;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
业务逻辑
1 调用购物车服务-勾选商品
1 查询是否新用户
2 查询购物车信息
getUserOrderCart
3 获取勾选的商品信息
4 刷新购物车商品信息
refreshOrderCartInfo
5 活动校验
是否可用
6 添加商品校验
价格、库存、限制数量等
7 校验成功设置当前商品勾选状态
8 重新计算总数和全选状态
9 保存缓存
ORDER_CART_KEY + customerId + ":" + distributorId
10 异步发消息同步db
topic-orderCart-serialize
2 设置购物车其他字段信息
1 购物车商品优惠券列表
优惠券信息按照商品分组
2 购物车选中合计
总金额-优惠券总金额-成长活动总金额
成长活动信息调用活动服务获取
fs-activity
优惠券信息调用优惠券服务获取
fs-promotion
3 已经优惠的金额
优惠券总金额 + 成长活动总金额
4 购物车商品信息
有效商品信息
5 购物车失效商品信息
无效商品信息
根据价格是否为空、商品上架状态、失效状态、库存数量
勾选全部商品
服务信息
fc-customer
checkAllCartSku
参数信息
@ApiModelProperty(value = "用户ID", example = "0")
private Long customerId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private Long itemId;
@ApiModelProperty(value = "选中状态 0-未选中 1-选中", example = "0")
private Integer checkStatus;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
private Long customerId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private Long itemId;
@ApiModelProperty(value = "选中状态 0-未选中 1-选中", example = "0")
private Integer checkStatus;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
业务逻辑
1 调用购物车服务-勾选全部商品
1 查询是否信息用户
2 查询购物车信息
getUserOrderCart
3 批量刷新购物车商品信息
refreshOrderCartInfoBatch
4 活动校验
是否可用
5 选中状态设置
6 重新计算总数和全选状态
7 保存缓存
ORDER_CART_KEY + customerId + ":" + distributorId
8 异步发消息同步db
topic-orderCart-serialize
2 设置购物车其他字段信息
1 购物车商品优惠券列表
优惠券信息按照商品分组
2 购物车选中合计
总金额-优惠券总金额-成长活动总金额
成长活动信息调用活动服务获取
fs-activity
优惠券信息调用优惠券服务获取
fs-promotion
3 已经优惠的金额
优惠券总金额+成长活动总金额
4 购物车商品信息
有效商品信息
5 购物车失效商品信息
无效商品信息
根据价格是否为空、商品上架状态、失效状态、库存数量
清空购物车失效商品
服务信息
fc-customer
clearInvalidCart
参数信息
@ApiModelProperty(value = "用户ID", example = "0")
private Long customerId;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private List<Long> itemIds;
private Long customerId;
@ApiModelProperty(value = "城市id", example = "0")
private Integer cityId;
@ApiModelProperty(value = "团长ID", example = "0")
private Long distributorId;
@ApiModelProperty(value = "自提点ID", example = "0")
private Long selfPickupId;
@ApiModelProperty(value = "商品记录唯一ID", example = "0")
private List<Long> itemIds;
业务逻辑
调用购物车服务-清空购物车失效商品
1 查询购物车信息
getUserOrderCart
2 移除失效数据
失效的
下架
库存<=0
无销售价格
3 重新计算总数和全选状态
4 保存缓存
ORDER_CART_KEY + customerId + ":" + distributorId
5 异步发消息同步db
topic-orderCart-serialize
确认订单前验证
服务信息
fc-customer
submitOrderValidate
参数信息
userToken
distributorId
selfPickupId
cityId
distributorId
selfPickupId
cityId
业务逻辑
调用库存服务-确认订单前验证
1 查询购物车信息
getUserOrderCart
isQueryAllSku:false
2 获取选中的商品信息
3 批量刷新购物车商品信息
refreshOrderCartInfoBatch
重新查询相关数据并设置
4 循环校验数据
volidateOrderCart
5 重新计算总数和全选状态
6 保存缓存
ORDER_CART_KEY + customerId + ":" + distributorId
7 异步发消息同步db
topic-orderCart-serialize
查询用户购物车商品总数量
服务信息
fc-customer
getUserCartNumber
参数信息
userToken
distributorId
selfPickupId
cityId
distributorId
selfPickupId
cityId
业务逻辑
1 调用购物车服务-查询用户购物车商品数量
1 查询购物车信息
getOrderCartFromCache
isQueryAllSku:true
重新查询所有商品
非缓存获取
2 重新获取商品信息
3 重新计算总数量及总价格
2 移除失效数据
失效的
下架
库存<=0
无销售价格
3 设置customId
清空用户购物车信息
服务信息
fs-ordercart
clearUserCart
参数信息
customerId
distributorId
isClearDB(是否清空DB)
distributorId
isClearDB(是否清空DB)
业务逻辑
是否传团长ID
是
1 清空购物车缓存
ORDER_CART_KEY + customerId + ":" + distributorId
2 根据参数判断是否清理DB
delete from order_cart where customer_id=#{customerId} and distributor_id=#{distributorId}
否
根据用户ID通过DB查询所有当前购物车信息
批量循环清理购物车信息
清理逻辑同上
支付成功清除购物车
服务信息
fs-ordercart
kafka消息监听
topic-orderCart-clear
业务逻辑
1 查询购物车缓存
2 根据支付成功的购买数量来情况购物车商品
如果购物车商品数量 <= 支付成功数量
则删除当前购物车商品
购物车商品数量 > 支付成功数量
设置购物车差值
3 重新计算总数和全选状态
4 保存缓存
ORDER_CART_KEY + customerId + ":" + distributorId
5 异步发消息同步db
topic-orderCart-serialize
0 条评论
下一页