Feature/2.0.1 collage order 刘鹏飞
【ID1010972】多人拼单
需求简述
拼单发起人
1、发起人进入门店点餐页面,查询是否存在正在进行的拼单订单,若存在则展示剩余时间卡片,点击banner弹出提示框,可以取消或者跳转至拼单菜单页
用户操作 触发调用 提供方 自动触发 查询当前拼单信息⑴ 购物车聚合 点击取消上一单 取消当前拼单⑶ 购物车聚合 2、若不存在正在进行的拼单,发起人在点餐页面点击拼单banner,发起拼单(创建拼单1小时有效)并跳转至拼单点餐页(高保真未显示有提示确认框)
用户操作 触发调用 提供方 点击拼单banner 创建拼单订单⑵ 购物车聚合 3、进入拼单点餐页,查询当前拼单成员信息
用户操作 触发调用 提供方 自动触发 查询拼单成员加购信息⑷ 购物车聚合 4、点击拼单点餐页右上方【取消拼单】按钮,取消本次拼单并返回点餐页
用户操作 触发调用 提供方 点击取消拼单 取消当前拼单⑶ 购物车聚合 5、点击拼单点餐页右上方【邀请好友】按钮,生成小程序页面快速入口转发给受邀人微信(此处需带入拼单订单标志以及拼单订单号)
用户操作 触发调用 提供方 点击邀请好友 查询当前拼单信息(也可从当前页面获取)⑴ 购物车聚合 6、点击加入购物车按钮添加发起人需要购买的商品至购物车
用户操作 触发调用 提供方 点击加入购物车 拼单购物车添加商品⑸ 购物车聚合 7、点击购物车图标展示当前拼单订单中所有拼单成员各自的购买内容,点击选好了按钮进入拼单订单页
用户操作 触发调用 提供方 自动触发 查询拼单购物车商品信息⑹ 购物车聚合 点击加减号 修改拼单购物车商品数量⑺ 购物车聚合 点击清空购物车 清空拼单购物车(自己)⑻ 购物车聚合 点击选好了 无 无 8、进入拼单订单页,显示当前拼单成员各自加入购物车的商品信息(实时),点击去结算按钮进入拼单订单锁定页,锁定当前拼单订单,锁定前检查受邀人是否全都商品加购完毕,否则弹框提示N位好友还在选购,是否去结算
用户操作 触发调用 提供方 自动触发 查询当前拼单信息⑴ 购物车聚合 自动触发 查询拼单购物车商品信息⑹ 购物车聚合 点击删除Ta 删除拼单受邀人及其购物车信息⑼ 购物车聚合 点击去结算 查询受邀人加购锁状态⑿、锁定拼单购物车⑽ 购物车聚合 9、进入拼单订单锁定页展示拼单详情信息,点击解锁按钮返回拼单订单页并解锁拼单,点击去结算按钮生成拼单订单及结算信息
用户操作 触发调用 提供方 自动触发 查询当前拼单信息⑴ 购物车聚合 自动触发 查询拼单购物车商品信息⑹ 购物车聚合 点击取消拼单 取消当前拼单⑶ 购物车聚合 点击解锁 解锁拼单购物车⑾ 购物车聚合 点击去结算 购物车商品算价 购物车聚合 10、在订单结算页面,点击去支付按钮拉起微信支付,成功支付后调用订单支付成功,后续逻辑与普通订单相同
用户操作 触发调用 提供方 自动触发 查询当前拼单信息⑴ 购物车聚合 自动触发 查询拼单购物车商品信息⑹ 购物车聚合 点击去支付 拼单订单创建⒃ 订单聚合
拼单受邀人
1、点击拼单发起人分享的内容,跳转至拼单加购页面,也可点击退出拼单按钮退出本次拼单订单
用户操作 触发调用 提供方 自动触发 受邀人加入拼单⒂ 购物车聚合 自动触发 查询拼单成员加购信息⑷ 购物车聚合 自动触发 查询拼单购物车商品信息⑹ 购物车聚合 点击退出拼单 删除拼单受邀人及其购物车信息⑼ 购物车聚合 2、受邀人加购商品,点击选好了进入拼单订单页
用户操作 触发调用 提供方 点击加入购物车 拼单购物车添加商品⑸ 购物车聚合 点击加减号 修改拼单购物车商品数量⑺ 购物车聚合 点击选好了 受邀人加购完毕锁定⒀ 购物车聚合 3、拼单订单页,受邀人可看到当前拼单订单状态以及所有拼单人各自加购的商品信息,可点击退出拼单按钮退出此拼单订单,也可点击修改商品按钮返回继续加购商品
用户操作 触发调用 提供方 点击退出拼单 删除拼单受邀人及其购物车信息⑼ 购物车聚合 点击修改商品 受邀人继续加购解锁⒁ 购物车聚合
接口列表
序号 | 类型 | 接口名称 | 接口描述 | 提供方 |
---|---|---|---|---|
⑴ | POST | /shoppingCart/collage/getOrder | 查询当前拼单信息 | 购物车聚合 |
⑵ | POST | /shoppingCart/collage/createOrder | 创建拼单订单购物车 | 购物车聚合 |
⑶ | POST | /shoppingCart/collage/cancelOrder | 取消当前拼单 | 购物车聚合 |
⑷ | 合并至拼单信息查询接口一同返回 | 查询拼单成员加购信息 | 购物车聚合 | |
⑸ | POST | /shoppingCart/collage/addGoods | 拼单购物车添加商品 | 购物车聚合 |
⑹ | POST | /shoppingCart/collage/listCartGoods | 查询拼单购物车商品信息 | 购物车聚合 |
⑺ | POST | /shoppingCart/collage/updateGoodsQty | 修改拼单购物车商品数量 | 购物车聚合 |
⑻ | POST | /shoppingCart/collage/clearPartCartGoods | 清空拼单购物车(自己) | 购物车聚合 |
⑼ | POST | /shoppingCart/collage/removeMember | 删除拼单受邀人及其购物车信息 | 购物车聚合 |
⑽ | POST | /shoppingCart/collage/lockOrder | 锁定拼单订单 | 购物车聚合 |
⑾ | POST | /shoppingCart/collage/unlockOrder | 解锁拼单订单 | 购物车聚合 |
⑿ | 合并至拼单信息查询接口一同返回 | 查询受邀人加购锁状态 | 购物车聚合 | |
⒀ | POST | /shoppingCart/collage/readyMemberState | 受邀人加购完毕锁定 | 购物车聚合 |
⒁ | POST | /shoppingCart/collage/shoppingMemberState | 受邀人继续加购解锁 | 购物车聚合 |
⒂ | POST | /shoppingCart/collage/addOrder | 受邀人加入拼单 | 购物车聚合 |
POST | /shoppingCart/collage/outOfOrder | 受邀人退出拼单 | 购物车聚合 | |
⒃ | POST | /order/collage/create | 拼单订单创建 | 订单聚合 |
POST | /order/collage/queryOrderById | 拼单订单详情查询 | 订单聚合 |
购物车缓存设计
购物车基本缓存
Key kgd:collage:base:{partnerId}:{storeId}:{userId}
类型 Hash
数据结构
Key | Value |
---|---|
id |
{orderId} |
createTime |
System.currentTimeMillis() |
expireTime |
System.currentTimeMillis() + 60*60*1000 |
createCollageUserId |
{createCollageUserId} |
partnerId |
{partnerId} |
storeId |
{storeId} |
购物车人员加购关系缓存
Key kgd:collage:member:{partnerId}:{storeId}:{userId}
类型 Hash
数据结构
Key | Value |
---|---|
{userId} |
[cartKey1, cartKey2...] |
购物车人员加购状态缓存
Key kgd:collage:member:state:{partnerId}:{storeId}:{userId}
类型 Hash
数据结构
Key | Value |
---|---|
{userId} |
@type=CollageMemberState {state:boolean, nickName:String, photoUrl:String, userId:String} |
购物车版本号缓存
Key kgd:collage:cart:ver:{partnerId}:{storeId}:{userId}
类型 String
购物车商品缓存
Key kgd:collage:cart:{partnerId}:{storeId}:{userId}
类型 Hash
数据结构
Key | Value |
---|---|
{cartGoodId} |
Json(cartGood) |
下单锁定购物车缓存
Key kgd:collage:lock:{partnerId}:{storeId}:{userId}
类型 String
Key | Value |
---|---|
kgd:collage:lock:{partnerId}:{storeId}:{userId} |
boolean |
门店下拼单参与人列表缓存
Key kgd:collage:store:member:{partnertId}:{storeId}
类型 Hash
Key | Value |
---|---|
{userId} |
{expireTime} |
相关问题
1、拼单订单标识使用订单表哪个字段来表示
orders -> marketing_type 4 拼团订单
2、拼单订单项对应实际加购人映射关系如何维护
添加订单项对应加购人关系维护表order_item_user
若订单marketing_type为4 拼团订单时,需额外维护order_item_user表
订单基础信息缓存OrderHashCache维护时需一同添加对应维护逻辑
3、订单基础项目新增对拼单订单项实际加购人信息的维护,涉及订单信息实体类中OrderItem相关对象新增userId字段,需修改共同查询订单项相关逻辑
下单入口在订单聚合模块,新增拼单订单controller,主流程同微信C端下单流程,购物车信息改为从拼单购物车接口获取
4、整店拼单参与人Hash
新增商户-门店拼单参与人列表Redis缓存,kgd:collage:store:member:{partnerId}:{storeId},类型Hash
由于是门店级别的数据,无法对整个key设置TTL,在出现大量废单的情况下(拼单即不完成也不取消),此时门店拼单参与人列表数据会一直存在并占用redis空间,当前Hash行数据存有拼单参与人userId以及拼单超时时间
1、拼单创建、加入前查询操作人行数据是否存在 且 是否在拼单超时时间内,满足条件则无法创建、加入拼单
2、拼单创建、加入时写入操作人行数据userId:拼单超时时间毫秒数
3、拼单完成、取消时删除该拼单下参与人行数据
实施方案
购物车聚合服务
1、解锁拼单订单
修改 kgd:collage:Iock:{partnerId}:{storeId}:{发起人ID} 为false
2、锁定拼单订单 结算购物车订单项
修改 kgd:collage:Iock:{partnerId}:{storeId}:{发起人ID} 为true
3、取消拼单订单
由拼单发起人提交操作,先删除整店拼单参与人名单中该拼单参与人集合,再删除该拼单订单相关redis缓存
4、清空拼单人购物车商品
5、拼单订单创建接口
6、拼单订单查询接口
7、拼单订单取消接口
订单聚合服务
1、新增拼单订单controller,主流程同微信C端下单流程,购物车信息改为从拼单购物车接口获取,返回数据需要在聚合层对订单基础返回的orderItemList根据加购人进行聚合调整
订单基础服务
1、新增订单项-加购人关系表 order_item_user
2、订单新增共同逻辑中,当marketingType=4的订单创建时,新增order_item_user表的数据插入
3、更新订单缓存时,新增对OrderHashCache中缓存信息orderItemList中userId的查询与绑定
4、OrderItem相关实体类新增userId字段并更新SDKjar包版本
1、新增订单项加购人关系维护表 2、订单创建流程添加对marketingType为拼单订单时的加购人关系维护逻辑 3、订单查询相关Bean传输对象添加对加购人信息字段的维护 4、Redis订单基础缓存ORDER_ITEM_LIST添加对加购人ID的信息维护
实施内容
购物车聚合服务
文件列表
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/adapter/CollageOrderSdkAdapter.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/constant/CollageLockStatus.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/constant/CollageMemberStateType.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/constant/CollageOrderCacheFields.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/constant/CollageOrderConstant.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/constant/RedisKeyConstant.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/constant/ShoppingCartConstant.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/domain/CartGoods.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/domain/CollageMemberState.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/domain/CollageOrder.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/domain/CollageOrderDto.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/service/CollageOrderBaseService.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/service/impl/CollageCartBaseServiceImpl.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/service/impl/CollageOrderBaseServiceImpl.java
assortment-shoppingcart-sdk/src/main/java/com/freemud/sdk/api/assortment/shoppingcart/util/DateTimeUtils.java
shopping-cart-application-service/src/main/java/cn/freemud/adapter/CollageOrderAdapter.java
shopping-cart-application-service/src/main/java/cn/freemud/adapter/ShoppingCartConvertAdapter.java
shopping-cart-application-service/src/main/java/cn/freemud/controller/CollageOrderController.java
shopping-cart-application-service/src/main/java/cn/freemud/controller/ShoppingCartCollageController.java
shopping-cart-application-service/src/main/java/cn/freemud/entities/dto/shoppingCart/ShoppingCartGoodsDto.java
shopping-cart-application-service/src/main/java/cn/freemud/entities/vo/AddShoppingCartGoodsRequestVo.java
shopping-cart-application-service/src/main/java/cn/freemud/entities/vo/CartGoods.java
shopping-cart-application-service/src/main/java/cn/freemud/entities/vo/CollageOrderRequestVo.java
shopping-cart-application-service/src/main/java/cn/freemud/entities/vo/CollageOrderResponseVo.java
shopping-cart-application-service/src/main/java/cn/freemud/entities/vo/ShoppingCartClearRequestVo.java
shopping-cart-application-service/src/main/java/cn/freemud/entities/vo/ShoppingCartCollageClearRequestVo.java
shopping-cart-application-service/src/main/java/cn/freemud/entities/vo/ShoppingCartCollageGoodsResponseVo.java
shopping-cart-application-service/src/main/java/cn/freemud/entities/vo/ShoppingCartCollageResponseVo.java
shopping-cart-application-service/src/main/java/cn/freemud/entities/vo/ShoppingCartGoodsResponseVo.java
shopping-cart-application-service/src/main/java/cn/freemud/entities/vo/ShoppingCartInfoRequestVo.java
shopping-cart-application-service/src/main/java/cn/freemud/entities/vo/UpdateShoppingCartGoodsQtyRequestVo.java
shopping-cart-application-service/src/main/java/cn/freemud/enums/ResponseResult.java
shopping-cart-application-service/src/main/java/cn/freemud/factory/AbstractShoppingCartImpl.java
shopping-cart-application-service/src/main/java/cn/freemud/service/CollageOrderService.java
shopping-cart-application-service/src/main/java/cn/freemud/service/ShoppingCartCollageService.java
shopping-cart-application-service/src/main/java/cn/freemud/service/impl/AssortmentSdkService.java
shopping-cart-application-service/src/main/java/cn/freemud/service/impl/CollageOrderServiceImpl.java
shopping-cart-application-service/src/main/java/cn/freemud/service/impl/ShoppingCartCollageServiceImpl.java
shopping-cart-application-service/src/test/java/cn.freemud/controller/CollageOrderControllerTest.java
shopping-cart-application-service/src/test/java/cn.freemud/service/CollageOrderBaseServiceTest.java
shopping-cart-application-service/src/test/java/cn.freemud/service/CollageOrderServiceTest.java
订单聚合服务
文件列表
assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/adapter/OrderSdkAdapter.java
assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/request/order/BaseCreateOrderRequest.java
assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/request/order/CreateOrderProductRequest.java
assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/response/order/QueryOrdersResponse.java
assortment-ordercenter-sdk\src\main\java\com\freemud\sdk\api\assortment\order\util\ClassUtils.java
order-application-service/src/main/java/cn/freemud/adapter/OrderAdapter.java
order-application-service/src/main/java/cn/freemud/controller/CollageOrderController.java
order-application-service/src/main/java/cn/freemud/controller/OrderController.java
order-application-service/src/main/java/cn/freemud/entities/dto/shoppingCart/ShoppingCartGoodsDto.java
order-application-service/src/main/java/cn/freemud/entities/vo/CreateOrderVo.java
order-application-service/src/main/java/cn/freemud/entities/vo/ProductVo.java
order-application-service/src/main/java/cn/freemud/entities/vo/QueryCollageOrderResponseVo.java
order-application-service/src/main/java/cn/freemud/entities/vo/QueryOrderResponseVo.java
order-application-service/src/main/java/cn/freemud/entities/vo/UserProductVo.java
order-application-service/src/main/java/cn/freemud/enums/OrderMarketType.java
order-application-service/src/main/java/cn/freemud/service/CollageOrderService.java
order-application-service/src/main/java/cn/freemud/service/Orderservice.java
order-application-service/src/main/java/cn/freemud/service/impl/CheckOrder.java
order-application-service/src/main/java/cn/freemud/service/impl/CollageOrderServiceImpl.java
order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
order-application-service/src/main/java/cn/freemud/service/thirdparty/ShoppingCartClient.java
ordercenter-sdk/src/main/java/com/freemud/application/sdk/api/ordercenter/request/carpark/OrderResp.java
ordercenter-sdk/src/main/java/com/freemud/application/sdk/api/ordercenter/request/create/CreateOrderRequest.java
ordercenter-sdk/src/main/java/com/freemud/application/sdk/api/ordercenter/request/create/OrderItemCreateReq.java
ordercenter-sdk/src/main/java/com/freemud/application/sdk/api/ordercenter/response/carpark/OrderResp.java
ordercenter-sdk/src/main/java/com/freemud/application/sdk/api/ordercenter/response/orderInfo/OrderInfoReqs.java
ordercenter-sdk/src/main/java/com/freemud/application/sdk/api/ordercenter/response/orderInfo/OrderItemResp.java
订单基础服务
新增表order_item_user
DROP TABLE IF EXISTS `order_item_user`;
CREATE TABLE `order_item_user` (
`id` bigint(20) NOT NULL COMMENT 'ID主键',
`order_id` bigint(20) NOT NULL COMMENT '订单ID',
`order_code` varchar(50) NULL DEFAULT '0' COMMENT '订单编码',
`order_item_id` bigint(20) NOT NULL COMMENT '订单项ID',
`user_id` varchar(50) NOT NULL DEFAULT '' COMMENT '订单项加购人ID',
`nick_name` varchar(50) DEFAULT '' COMMENT '订单项加购人昵称',
`photo_url` varchar(200) DEFAULT '' COMMENT '订单项加购人头像',
`create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_order_id`(`order_id`) USING BTREE,
INDEX `idx_order_code`(`order_code`) USING BTREE,
INDEX `idx_order_item_id`(`order_item_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '订单商品加购人关系表' ROW_FORMAT = Dynamic;
文件列表
doc/数据库/【ID1010972】多人拼单_订单项加购人关系表_20200930.sql
shared-order-biz/src/main/java/cn/freemud/shared/order/cache/OrderHashCache.java
shared-order-biz/src/main/java/cn/freemud/shared/order/dto/OrderDto.java
shared-order-biz/src/main/java/cn/freemud/shared/order/dto/OrderItemDto.java
shared-order-biz/src/main/java/cn/freemud/shared/order/manager/order/OrderItemUserMag.java
shared-order-biz/src/main/java/cn/freemud/shared/order/po/OrderItemUser.java
shared-order-biz/src/main/java/cn/freemud/shared/order/repository/OrderItemUserMapper.java
shared-order-biz/src/main/java/cn/freemud/shared/order/resp/order/OrderItemResp.java
shared-order-biz/src/main/java/cn/freemud/shared/order/service/impl/DefaultOrderServiceImpl.java
shared-order-biz/src/main/resources/generator/generatorConfig.xml
shared-order-biz/src/main/resources/mapper/OrderItemUserMapper.xml
shared-order-common/src/main/java/cn/freemud/shared/order/enums/order/OrderItemMarketType.java
shared-order-common/src/main/java/cn/freemud/shared/order/enums/order/OrderMarketType.java
shared-order/src/main/java/cn/freemud/shared/order/vo/req/order/OrderItemCreateReq.java