订单重构
订单重构
数据库
订单表
CREATE TABLE `tbl_order` (
`id` varchar(11) NOT NULL DEFAULT '' COMMENT '订单ID',
`type` tinyint(4) NOT NULL COMMENT '订单类型(1:PL,2:LK)',
`serial` varchar(64) NOT NULL DEFAULT '' COMMENT '订单修改序列号',
`user_id` varchar(11) NOT NULL DEFAULT '' COMMENT '用户ID或站点ID',
`address_id` varchar(11) NOT NULL DEFAULT '' COMMENT '店铺ID或站点ID',
`address` varchar(200) NOT NULL DEFAULT '' COMMENT '收货地址',
`receiver_name` varchar(50) NOT NULL DEFAULT '' COMMENT '收货人',
`receiver_phone` varchar(50) NOT NULL DEFAULT '' COMMENT '收货人电话',
`area_id` bigint(20) NOT NULL COMMENT '区域ID',
`district_code` varchar(10) NOT NULL DEFAULT '' COMMENT '城市码',
`resname` varchar(100) NOT NULL DEFAULT '' COMMENT '店铺名',
`pay_method` tinyint(4) NOT NULL COMMENT '付款方式',
`station_id` varchar(10) NOT NULL DEFAULT '' COMMENT '站点ID',
`time_config_id` varchar(10) NOT NULL DEFAULT '' COMMENT '时间配置ID',
`order_time` datetime NOT NULL COMMENT '下单时间',
`sorting_time` datetime DEFAULT NULL COMMENT '分拣时间',
`distribute_time` datetime DEFAULT NULL COMMENT '配送时间',
`pay_time` datetime DEFAULT NULL COMMENT '支付时间',
`create_time` datetime NOT NULL COMMENT '创建时间',
`modify_time` datetime DEFAULT NULL COMMENT '修改时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`expire_time` datetime DEFAULT NULL COMMENT '过期时间',
`close_time` datetime DEFAULT NULL COMMENT '关闭时间',
`receive_begin_time` datetime NOT NULL COMMENT '收货开始时间',
`receive_end_time` datetime NOT NULL COMMENT '收货结束时间',
`status` int(11) NOT NULL COMMENT '状态',
`pay_status` int(11) NOT NULL COMMENT '支付状态',
`settle_way` int(11) NOT NULL COMMENT '商户结算方式',
`price` bigint(11) NOT NULL COMMENT '下单金额',
`real_price` bigint(11) NOT NULL COMMENT '出库金额',
`fee` bigint(11) NOT NULL COMMENT '应付金额',
`real_pay` bigint(11) NOT NULL DEFAULT '0' COMMENT '实付',
`paid_amount` bigint(11) NOT NULL DEFAULT '0' COMMENT '已支付金额',
`refund_amount` bigint(11) NOT NULL DEFAULT '0' COMMENT '退款金额',
`freeze` int(11) NOT NULL COMMENT '订单锁定状态',
`refund_price` bigint(11) NOT NULL DEFAULT '0' COMMENT '退货金额',
`refund_number` int(11) NOT NULL DEFAULT '0' COMMENT '退货数',
`abnormal_price` bigint(11) NOT NULL DEFAULT '0' COMMENT '异常金额',
`abnormal_number` int(11) NOT NULL DEFAULT '0' COMMENT '异常数',
`freight_price` int(11) NOT NULL DEFAULT '0' COMMENT '退货金额',
`remark` varchar(100) DEFAULT NULL COMMENT '订单备注',
`pay_remak` varchar(100) DEFAULT NULL COMMENT '付款备注',
`aggregate_type` int(11) NOT NULL DEFAULT '0' COMMENT '聚合方式',
`extra1` int(11) DEFAULT NULL COMMENT '备份字段',
`extra2` int(11) DEFAULT NULL COMMENT '备份字段',
`extra3` varchar(32) DEFAULT NULL COMMENT '备份字段',
`extra4` varchar(32) DEFAULT NULL COMMENT '备份字段',
`extra5` datetime DEFAULT NULL COMMENT '备份字段',
`extra6` datetime DEFAULT NULL COMMENT '备份字段',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
订单详情表
CREATE TABLE `tbl_order_detail` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
`order_id` varchar(11) NOT NULL DEFAULT '' COMMENT '订单ID',
`sku_id` varchar(20) NOT NULL DEFAULT '' COMMENT '商品ID',
`sku_version` int(11) NOT NULL COMMENT '版本号',
`sku_name` varchar(50) NOT NULL DEFAULT '' COMMENT 'sku名称',
`sale_unit_name` varchar(10) NOT NULL DEFAULT '' COMMENT 'sku单位',
`sale_price` int(11) NOT NULL COMMENT '销售价',
`sku_is_weight` tinyint(4) NOT NULL COMMENT '是否称重商品',
`sku_is_price_timing` tinyint(11) NOT NULL COMMENT '是否时价商品',
`sku_attrition_rate` float NOT NULL COMMENT 'sku损耗率',
`sale_ratio` float NOT NULL COMMENT '规格',
`spu_id` varchar(20) NOT NULL DEFAULT '' COMMENT 'spu id',
`std_unit_name` varchar(10) NOT NULL DEFAULT '' COMMENT 'spu单位',
`std_sale_price` int(11) NOT NULL COMMENT 'sku售价',
`is_weighted` int(11) NOT NULL COMMENT '是否已称重',
`spu_remark` varchar(50) DEFAULT NULL COMMENT '商品备注',
`order_count` double NOT NULL COMMENT '下单数',
`real_count` double NOT NULL COMMENT '实际下单数(包含损耗)',
`out_count` double NOT NULL COMMENT '出库数',
`pay_count` double NOT NULL COMMENT '结账数',
`weight_count` double DEFAULT NULL COMMENT '称重数',
`out_of_stock` tinyint(4) DEFAULT NULL COMMENT '缺货标记',
`std_real_count` double NOT NULL COMMENT '标准单位出库数',
`std_pay_count` double NOT NULL COMMENT '标准单位结账数',
`total_price` int(11) NOT NULL COMMENT '下单金额',
`real_price` int(11) NOT NULL COMMENT '出库金额',
`fee` int(11) NOT NULL COMMENT '应付金额',
`salemenu_id` varchar(11) NOT NULL DEFAULT '' COMMENT '销售单ID',
`origin_sale_price` int(11) DEFAULT NULL COMMENT '原销售价',
`rule_id` varchar(20) DEFAULT NULL COMMENT '锁价规格ID',
`origin_price` int(11) DEFAULT NULL COMMENT '原下单金额',
`fake_price` int(11) DEFAULT NULL COMMENT '伪下单金额',
`cost` int(11) DEFAULT NULL COMMENT '成本价格',
`extra1` int(11) DEFAULT NULL COMMENT '备用字段',
`extra2` int(11) DEFAULT NULL COMMENT '备用字段',
`extra3` varchar(32) DEFAULT NULL COMMENT '备用字段',
`extra4` varchar(32) DEFAULT NULL COMMENT '备用字段',
`extra5` datetime DEFAULT NULL COMMENT '备用字段',
`extra6` datetime DEFAULT NULL COMMENT '备用字段',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
订单供应关系表
CREATE TABLE `tbl_order_supply_chain` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`origin_order_id` varchar(11) NOT NULL DEFAULT '',
`origin_sku_id` varchar(11) NOT NULL DEFAULT '',
`origin_quantity` double NOT NULL,
`up_order_id` varchar(11) NOT NULL DEFAULT '',
`up_sku_id` varchar(11) NOT NULL DEFAULT '',
`up_quantity` double NOT NULL,
`up_station_id` varchar(10) NOT NULL COMMENT '站点ID',
`aggregate_type` int(11) NOT NULL DEFAULT '0' COMMENT '聚合方式',
`time_config_id` varchar(10) NOT NULL DEFAULT '' COMMENT '时间配置ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
订单流水表
CREATE TABLE `tbl_order_flow` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`key` varchar(128) NOT NULL,
`serial` varchar(64) NOT NULL,
`datetime` datetime NOT NULL,
`request_id` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
相关功能接口
bshop
- /order/submit 提交订单 新建订单或更新订单商品
- /order/receipt 签收订单 更新订单状态
- /order/paid 设置订单为已支付 查询订单 更新订单状态和支付信息
- /pay 获取支付信息 更新订单状态和支付信息
- /pay/wechat/notify 支付结果通知 更新订单状态和支付信息
manage
- /ordermanage/exception/PLxx 添加异常信息 更新订单商品实收数量、应付金额和异常、退货信息
station
- update_order_sku_stock 出库接口 修改订单商品成本金额
- set_real_quantity 称重接口 更新商品出库数及相关金额信息
- /station/order/create station下单 创建订单、更新订单
- /station/order/edit station更新订单 更新订单
- /station/order/set_status 批量设置订单状态 更新订单状态
接口
bshop
split_order 分单
- 将购物车中的商品根据站点和服务时间分组
- 判断每组商品是否可以合并到已经已经下的订单中
- 计算分组的商品总价和运费
/order/submit 订单提交
接口名: /order/submit
Method: POST
请求:
orders M list 下单信息
[{
salemenu_ids M list 销售单ID列表
sku_ids M list 商品ID列表
station_id M string 站点ID
spu_remark M dict 商品备注
{
spu_id: 备注信息
}
}]
响应:
code M int 返回码
msg M str 错误提示信息
data M dict 订单信息
[{
code M int 下单结果
msg M string 提示信息
extender M dict 信息
{
_id M string 订单ID
order_id M string 订单ID
total_pay M int 下单金额
customer M dict
{
receive_begin_time M string 收货开始时间
receive_end_time M string 收货结束时间
}
}
}]
逻辑:
1. 检测商户状态(是否冻结、欠款)
2. 检测收货时间设置
3. 检查下单时间(当前是否在下单周期内)
4. 生成收货时间
5. 处理spu备注
6. 检查sku是否存在、上架状态、当前客户能否下单、库存
7. 验证服务时间 商品是否处理同一服务时间的销售单、是否在下单时间内
9. 扣减库存
10. 调用下单/更新接口
11. 成功,发送消息通知;失败,恢复库存
order
/order/create 创建订单
接口名: /order/create
Method: POST
请求:
customer M dict 商户信息
{
user_id M string 用户ID
address_id M string 店铺ID
address M string 店铺地址
receiver_name M string 收货人
receiver_phone M string 收货电话
resname M string 店铺名
area_id M int 店铺区域
district_code M string 城市码
pay_method M int 支付方式
settle_way M int 结算方式
}
station_id M string 站点ID
receive_begin_time M string 收货开始时间
receive_end_time M string 收货结束时间
skus M list 下单商品信息
[{
id M string 商品ID
amount M float 商品数量
price O float 商品价格
name M string 商品名
version M int sku版本号
sale_unit_name M string 单位名称
sale_price M int 销售价格
is_weight M int 是否称重
salemenu_id M string 销售单ID
is_price_timing M int 是否时价商品
attrition_rate M float 损耗率
sale_ratio M float 规格
spu_id M string spu id
std_unit_name M string 标准单位
std_sale_price M float 标准单位价格
spu_remark M string 商品备注
}]
price_rule M dict 锁价信息
{
sku_id M string 商品ID
{
rule_type M int 规则类型
rule_id M string 规则ID
yx_price M int 规则价格
}
}
freight M dict 运费规则
time_config_id M str 服务时间ID
remark M string 订单备注
响应:
code M int 返回码
msg M str 错误提示信息
data M dict 订单信息
{
order_id M string 订单ID
}
逻辑:
1. 生成商品详情(根据锁价规则、是否传入单价计算商品价格)
2. 计算订单价格
3. 生成运费
4. 保存订单
5. 发送异步消息(更新LK单,同步出库单)
/order/update 更新订单详情
接口名: /order/update
Method: POST
请求:
order_id M string 站点ID
receive_begin_time O int 收货开始时间
receive_end_time O int 收货结束时间
price_rule M list 锁价信息
freight M dict 运费规则
is_delta M bool 是否增量修改(默认为False)
skus M list 下单商品信息
[{
id M string 商品ID
amount M float 商品数量
price O float 商品价格
name M string 商品名
version M int sku版本号
sale_unit_name M string 单位名称
sale_price M int 销售价格
is_weight M int 是否称重
salemenu_id M string 销售单ID
is_price_timing M int 是否时价商品
attrition_rate M float 损耗率
material M list spu相关信息
[{
sale_ratio M float 规格
spu_id M string spu id
std_unit_name M string 标准单位
std_sale_price M float 标准单位价格
}]
}]
响应:
code M int 返回码
msg M str 错误提示信息
data M dict 返回数据
逻辑:
1. 获取订单数据
2. 区分新增商品、更新商品
3. 新增商品生成商品详情,更新商品修改商品数量、计算商品价格
4. 计算订单总价
5. 生成运费
6. 保存订单
7. 发送异步消息(更新LK单,同步出库单)
/order/delete 删除订单详情
接口名: /order/delete
Method: POST
请求:
id M string 订单ID
响应:
code M int 返回码
msg M str 错误提示信息
data M dict 返回数据
逻辑:
1. 获取订单数据
2. 更新订单状态为已删除
3. 发送异步消息(更新LK单,同步出库单)
/order/supply/update 更新上游供应订单
接口名: /order/supply/update
Method: POST
请求:
order_id M string 站点ID
customer M dict 商户信息
{
user_id M string 用户ID
address_id M string 店铺ID
address M string 店铺地址
receiver_name M string 收货人
receiver_phone M string 收货电话
resname M string 店铺名
area_id M int 店铺区域
district_code M string 城市码
pay_method M int 支付方式
}
station_id M string 站点ID
receive_begin_time M string 收货开始时间
receive_end_time M string 收货结束时间
cart M list 购物车商品信息
[{
sku_id M string 商品ID
amount M float 商品数量
origin_sku_id M string 原商品ID
origin_amount M float 原商品数量
}]
skus M list 商品信息
[{
id M string 商品ID
name M string 商品名
version M int sku版本号
sale_unit_name M string 单位名称
sale_price M int 销售价格
is_weight M int 是否称重
salemenu_id M string 销售单ID
is_price_timing M int 是否时价商品
attrition_rate M float 损耗率
split_flag M int 分切标识
sale_ratio M float 规格
spu_id M string spu id
std_unit_name M string 标准单位
std_sale_price M float 标准单位价格
}]
price_rule M dict 锁价信息
time_config_id M str 服务时间配置ID
service_time_type M int 服务时间类型
aggregate_type M int 订单聚合类型
service_begin_time M string 站点开始服务时间
service_end_time M string 站点结束服务时间
响应:
code M int 返回码
msg M str 错误提示信息
data M dict 返回数据
逻辑:
1. 判断订单是否存在上游,存在上游则合并商品到上游订单中
2. 不存在上游,则判断聚合类型是否合单,不合单则新建订单
3. 查询是否存在是否存在相同站点、聚合类型、时间配置在同一时间周期下的订单
4. 存在上游订单则更新订单,不存在则新建订单
station
/station/order/supply/dispatch 订单上游分配
接口名: /order/supply/dispatch
Method: POST
请求:
order_id M string 订单ID
cart M list 原订单商品和数量
[{
sku_id M string 订单ID
amount M float 商品数量
}]
响应:
code M int 返回码
msg M str 错误提示信息
data M dict 返回数据
逻辑:
1. 获取订单详情
2. 获取商品详情
3. 根据商品站点、聚合类型进行商品分组
4. 根据站点信息生成customer参数
5. 生成收货时间,预售根据用户的收货时间设置,非预售设置为第二天站点收货时间
6. 计算站点的下单周期或者收货周期(合单用), 预售计算客户收货时间所在的收货周期,非预售计算时间配置的下单周期
7. 调用更新上游供应商订单接口
逻辑改动
- 生成sku快照放在修改sku信息时
- 库存扣减放在web层