mirror of
https://github.com/crmeb/CRMEB.git
synced 2026-10-28 21:40:50 +00:00
chore: 删除旧的订单开发流程文档和任务计划文件
This commit is contained in:
parent
fb32d31fc1
commit
d063cb2225
@ -1,677 +0,0 @@
|
||||
# CRMEB 订单开发流程文档
|
||||
|
||||
## 📋 需求背景
|
||||
为了规范CRMEB系统的订单功能开发,提供完整的订单业务流程、技术实现规范和开发指导,确保开发团队能够高效、标准化地进行订单相关功能的开发与维护。
|
||||
|
||||
## 🏗️ 订单系统架构概览
|
||||
|
||||
### 整体架构模式
|
||||
- **框架**: ThinkPHP 6.0 + 多应用模式
|
||||
- **架构模式**: MVC + 三层架构(Controller → Service → DAO/Model)
|
||||
- **请求流程**: 路由分发 → 中间件 → 控制器 → 服务层 → DAO层 → 数据库
|
||||
|
||||
### 核心模块结构
|
||||
```
|
||||
订单模块/
|
||||
├── Controller层/
|
||||
│ ├── 前端API: api/controller/v1/order/StoreOrderController.php
|
||||
│ ├── 管理端API: api/controller/v1/admin/StoreOrderController.php
|
||||
│ └── PC端API: api/controller/pc/OrderController.php
|
||||
├── Service层/
|
||||
│ ├── StoreOrderServices.php (核心订单服务)
|
||||
│ ├── StoreOrderCreateServices.php (订单创建服务)
|
||||
│ ├── StoreOrderComputedServices.php (订单计算服务)
|
||||
│ ├── StoreOrderDeliveryServices.php (订单配送服务)
|
||||
│ ├── StoreOrderRefundServices.php (订单退款服务)
|
||||
│ ├── StoreOrderStatusServices.php (订单状态服务)
|
||||
│ └── StoreOrderSuccessServices.php (订单成功服务)
|
||||
├── DAO层/
|
||||
│ └── StoreOrderDao.php (订单数据访问)
|
||||
└── Model层/
|
||||
└── StoreOrder.php (订单模型)
|
||||
```
|
||||
|
||||
## 🔄 订单业务流程详解
|
||||
|
||||
### 1. 订单创建流程
|
||||
```
|
||||
用户下单 → 购物车确认 → 订单计算 → 订单创建 → 库存扣减 → 支付处理
|
||||
```
|
||||
|
||||
#### 1.1 订单确认页面 (`/order/confirm`)
|
||||
**Controller**: `StoreOrderController::confirm()`
|
||||
**Service**: `StoreOrderServices::getOrderConfirmData()`
|
||||
**数据流转**:
|
||||
```php
|
||||
// 接收参数
|
||||
$cartId, $new, $addressId, $shipping_type, $is_gift
|
||||
|
||||
// 业务处理
|
||||
1. 验证购物车商品有效性
|
||||
2. 计算商品价格、运费、优惠
|
||||
3. 检查用户地址信息
|
||||
4. 获取可用优惠券
|
||||
5. 返回确认页面数据
|
||||
```
|
||||
|
||||
#### 1.2 订单金额计算 (`/order/computed/:key`)
|
||||
**Controller**: `StoreOrderController::computedOrder()`
|
||||
**Service**: `StoreOrderComputedServices`
|
||||
**核心计算逻辑**:
|
||||
```php
|
||||
// 计算参数
|
||||
$addressId, $couponId, $payType, $useIntegral, $mark, $shipping_type
|
||||
|
||||
// 计算流程
|
||||
1. 商品总价计算
|
||||
2. 运费计算 (ShippingTemplatesServices)
|
||||
3. 优惠券抵扣计算
|
||||
4. 积分抵扣计算
|
||||
5. 会员折扣计算
|
||||
6. 最终支付金额确认
|
||||
```
|
||||
|
||||
#### 1.3 订单创建 (`/order/create/:key`)
|
||||
**Controller**: `StoreOrderController::create()`
|
||||
**Service**: `StoreOrderCreateServices::createOrder()`
|
||||
**关键步骤**:
|
||||
```php
|
||||
// 订单生成流程
|
||||
1. 生成唯一订单ID (雪花算法)
|
||||
2. 订单基本信息入库
|
||||
3. 订单商品信息入库 (StoreOrderCartInfoServices)
|
||||
4. 库存扣减 (StoreProductServices)
|
||||
5. 优惠券使用记录
|
||||
6. 积分扣减记录
|
||||
7. 订单状态记录 (StoreOrderStatusServices)
|
||||
8. 返回订单信息
|
||||
```
|
||||
|
||||
### 2. 订单支付流程
|
||||
```
|
||||
选择支付方式 → 支付参数生成 → 第三方支付 → 支付回调 → 订单状态更新
|
||||
```
|
||||
|
||||
#### 2.1 支付处理 (`/order/pay`)
|
||||
**Service**: `OrderPayServices`
|
||||
**支持支付方式**:
|
||||
- 微信支付 (WechatPayServices)
|
||||
- 支付宝支付 (AlipayPayServices)
|
||||
- 余额支付 (YuePayServices)
|
||||
- 线下支付 (OrderOfflineServices)
|
||||
|
||||
#### 2.2 支付回调处理
|
||||
```php
|
||||
// 支付成功后处理流程
|
||||
1. 验证回调签名
|
||||
2. 更新订单支付状态 (paid=1, pay_time)
|
||||
3. 扣减商品库存
|
||||
4. 生成用户账单记录
|
||||
5. 触发相关营销活动
|
||||
6. 发送支付成功通知
|
||||
```
|
||||
|
||||
### 3. 订单状态流转
|
||||
```
|
||||
待支付 → 已支付 → 待发货 → 待收货 → 已完成 → 已评价
|
||||
↓
|
||||
已取消 → 已删除
|
||||
↓
|
||||
退款中 → 已退款
|
||||
```
|
||||
|
||||
#### 3.1 状态定义
|
||||
```php
|
||||
// StoreOrderServices 订单状态常量
|
||||
const STATUS_UNPAID = 0; // 待支付
|
||||
const STATUS_PAID = 1; // 已支付/待发货
|
||||
const STATUS_SHIPPED = 2; // 待收货
|
||||
const STATUS_RECEIVED = 3; // 已完成
|
||||
const STATUS_EVALUATE = 4; // 已评价
|
||||
const STATUS_PART_SHIPPED = 5; // 部分发货
|
||||
```
|
||||
|
||||
#### 3.2 状态变更服务
|
||||
- `StoreOrderStatusServices`: 订单状态变更记录
|
||||
- `StoreOrderSuccessServices`: 订单成功处理
|
||||
- `StoreOrderTakeServices`: 订单收货处理
|
||||
|
||||
### 4. 订单退款流程
|
||||
```
|
||||
申请退款 → 审核处理 → 退款处理 → 状态更新 → 库存恢复
|
||||
```
|
||||
|
||||
#### 4.1 退款申请
|
||||
**Controller**: `StoreOrderController::refund_verify()`
|
||||
**Service**: `StoreOrderRefundServices`
|
||||
|
||||
#### 4.2 退款处理类型
|
||||
- 部分退款 (部分商品退款)
|
||||
- 整单退款 (整个订单退款)
|
||||
- 仅退款 (不退货)
|
||||
- 退货退款 (需要退货)
|
||||
|
||||
### 5. 订单发货流程
|
||||
```
|
||||
订单发货 → 物流信息录入 → 状态更新 → 用户通知 → 物流跟踪
|
||||
```
|
||||
|
||||
#### 5.1 发货类型
|
||||
```php
|
||||
// StoreOrderServices 发货类型
|
||||
public $deliveryType = [
|
||||
'send' => '商家配送', // 同城配送
|
||||
'express' => '快递配送', // 快递发货
|
||||
'fictitious' => '虚拟发货', // 虚拟商品
|
||||
'delivery_part_split' => '拆分部分发货', // 部分发货
|
||||
'delivery_split' => '拆分发货完成' // 完成发货
|
||||
];
|
||||
```
|
||||
|
||||
#### 5.2 发货服务
|
||||
- `StoreOrderDeliveryServices`: 发货处理
|
||||
- `ExpressServices`: 物流信息查询
|
||||
|
||||
## 🗄️ 数据库设计
|
||||
|
||||
### 核心表结构
|
||||
|
||||
#### 订单主表 (eb_store_order)
|
||||
```sql
|
||||
CREATE TABLE `eb_store_order` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
|
||||
`order_id` varchar(32) NOT NULL COMMENT '订单号',
|
||||
`uid` int(11) NOT NULL COMMENT '用户ID',
|
||||
`real_name` varchar(32) DEFAULT NULL COMMENT '收货人姓名',
|
||||
`user_phone` varchar(16) DEFAULT NULL COMMENT '收货人电话',
|
||||
`user_address` varchar(255) DEFAULT NULL COMMENT '收货地址',
|
||||
`cart_id` varchar(255) DEFAULT NULL COMMENT '购物车ID',
|
||||
`total_num` int(11) DEFAULT '0' COMMENT '订单商品总数',
|
||||
`total_price` decimal(10,2) DEFAULT '0.00' COMMENT '订单总价',
|
||||
`total_postage` decimal(10,2) DEFAULT '0.00' COMMENT '邮费',
|
||||
`pay_price` decimal(10,2) DEFAULT '0.00' COMMENT '实际支付金额',
|
||||
`pay_postage` decimal(10,2) DEFAULT '0.00' COMMENT '支付邮费',
|
||||
`deduction_price` decimal(10,2) DEFAULT '0.00' COMMENT '抵扣金额',
|
||||
`coupon_id` int(11) DEFAULT '0' COMMENT '优惠券ID',
|
||||
`coupon_price` decimal(10,2) DEFAULT '0.00' COMMENT '优惠券金额',
|
||||
`paid` tinyint(1) DEFAULT '0' COMMENT '支付状态',
|
||||
`pay_time` timestamp NULL DEFAULT NULL COMMENT '支付时间',
|
||||
`pay_type` varchar(20) DEFAULT NULL COMMENT '支付方式',
|
||||
`status` tinyint(1) DEFAULT '0' COMMENT '订单状态',
|
||||
`refund_status` tinyint(1) DEFAULT '0' COMMENT '退款状态',
|
||||
`refund_reason` varchar(255) DEFAULT NULL COMMENT '退款理由',
|
||||
`refund_reason_wap_img` varchar(255) DEFAULT NULL COMMENT '退款图片',
|
||||
`refund_reason_wap_explain` varchar(255) DEFAULT NULL COMMENT '退款用户说明',
|
||||
`refund_price` decimal(10,2) DEFAULT '0.00' COMMENT '退款金额',
|
||||
`refund_price_time` timestamp NULL DEFAULT NULL COMMENT '退款时间',
|
||||
`delivery_name` varchar(64) DEFAULT NULL COMMENT '快递公司',
|
||||
`delivery_id` varchar(100) DEFAULT NULL COMMENT '快递单号',
|
||||
`delivery_type` varchar(32) DEFAULT NULL COMMENT '发货方式',
|
||||
`delivery_uid` int(11) DEFAULT '0' COMMENT '配送员ID',
|
||||
`delivery_code` varchar(50) DEFAULT NULL COMMENT '快递公司编码',
|
||||
`store_id` int(11) DEFAULT '0' COMMENT '门店ID',
|
||||
`shipping_type` tinyint(1) DEFAULT '1' COMMENT '配送方式 1=快递 2=自提',
|
||||
`pick_up_code` varchar(50) DEFAULT NULL COMMENT '核销码',
|
||||
`mark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`unique` varchar(32) DEFAULT NULL COMMENT '唯一key(md5加密)用于查询',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '管理员备注',
|
||||
`mer_id` int(11) DEFAULT '0' COMMENT '商户ID',
|
||||
`is_del` tinyint(1) DEFAULT '0' COMMENT '是否删除',
|
||||
`is_system_del` tinyint(1) DEFAULT '0' COMMENT '是否系统删除',
|
||||
`combination_id` int(11) DEFAULT '0' COMMENT '拼团产品ID',
|
||||
`pink_id` int(11) DEFAULT '0' COMMENT '拼团ID',
|
||||
`seckill_id` int(11) DEFAULT '0' COMMENT '秒杀产品ID',
|
||||
`bargain_id` int(11) DEFAULT '0' COMMENT '砍价产品ID',
|
||||
`order_type` varchar(32) DEFAULT '' COMMENT '订单类型',
|
||||
`activity_type` varchar(32) DEFAULT '' COMMENT '活动类型',
|
||||
`channel_type` tinyint(1) DEFAULT '0' COMMENT '渠道类型',
|
||||
`extension_type` varchar(32) DEFAULT '' COMMENT '扩展类型',
|
||||
`staff_id` int(11) DEFAULT '0' COMMENT '客服ID',
|
||||
`vip_price` decimal(10,2) DEFAULT '0.00' COMMENT '会员价格',
|
||||
`finance_status` tinyint(1) DEFAULT '0' COMMENT '财务状态',
|
||||
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `order_id` (`order_id`),
|
||||
KEY `uid` (`uid`),
|
||||
KEY `paid` (`paid`),
|
||||
KEY `status` (`status`),
|
||||
KEY `is_del` (`is_del`),
|
||||
KEY `unique` (`unique`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
|
||||
```
|
||||
|
||||
#### 订单商品表 (eb_store_order_cart_info)
|
||||
```sql
|
||||
CREATE TABLE `eb_store_order_cart_info` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`oid` int(11) NOT NULL COMMENT '订单ID',
|
||||
`cart_id` int(11) DEFAULT NULL COMMENT '购物车ID',
|
||||
`product_id` int(11) NOT NULL COMMENT '产品ID',
|
||||
`cart_num` int(11) NOT NULL COMMENT '购买数量',
|
||||
`unique` varchar(50) NOT NULL COMMENT '唯一ID',
|
||||
`product_name` varchar(255) NOT NULL COMMENT '产品名称',
|
||||
`image` varchar(255) DEFAULT NULL COMMENT '产品图片',
|
||||
`unit_name` varchar(32) DEFAULT NULL COMMENT '单位名',
|
||||
`price` decimal(10,2) DEFAULT '0.00' COMMENT '产品价格',
|
||||
`cost` decimal(10,2) DEFAULT '0.00' COMMENT '产品成本',
|
||||
`vip_price` decimal(10,2) DEFAULT '0.00' COMMENT '会员价格',
|
||||
`pay_price` decimal(10,2) DEFAULT '0.00' COMMENT '实际支付价格',
|
||||
`pay_postage` decimal(10,2) DEFAULT '0.00' COMMENT '实际支付邮费',
|
||||
`is_gift` tinyint(1) DEFAULT '0' COMMENT '是否是赠品',
|
||||
`cart_info` text COMMENT '购物车信息',
|
||||
`refund_num` int(11) DEFAULT '0' COMMENT '退款数量',
|
||||
`is_refund` tinyint(1) DEFAULT '0' COMMENT '是否退款',
|
||||
`refund_price` decimal(10,2) DEFAULT '0.00' COMMENT '退款金额',
|
||||
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` timestamp NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `oid` (`oid`),
|
||||
KEY `product_id` (`product_id`),
|
||||
KEY `unique` (`unique`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单商品表';
|
||||
```
|
||||
|
||||
## 🔧 开发规范与最佳实践
|
||||
|
||||
### 1. Service层开发规范
|
||||
|
||||
#### 1.1 基础服务结构
|
||||
```php
|
||||
class StoreOrderServices extends BaseServices
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
* @param StoreOrderDao $dao
|
||||
*/
|
||||
public function __construct(StoreOrderDao $dao)
|
||||
{
|
||||
$this->dao = $dao;
|
||||
}
|
||||
|
||||
/**
|
||||
* 业务方法示例
|
||||
* @param int $orderId 订单ID
|
||||
* @param array $data 请求数据
|
||||
* @return array
|
||||
* @throws ApiException
|
||||
*/
|
||||
public function businessMethod(int $orderId, array $data): array
|
||||
{
|
||||
// 1. 参数验证
|
||||
if (!$orderId) {
|
||||
throw new ApiException('参数错误');
|
||||
}
|
||||
|
||||
// 2. 数据查询
|
||||
$order = $this->dao->get($orderId);
|
||||
if (!$order) {
|
||||
throw new ApiException('订单不存在');
|
||||
}
|
||||
|
||||
// 3. 业务逻辑处理
|
||||
// ...业务处理代码
|
||||
|
||||
// 4. 数据更新
|
||||
$this->dao->update($orderId, $updateData);
|
||||
|
||||
// 5. 返回结果
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 1.2 异常处理规范
|
||||
```php
|
||||
// 使用项目特定异常类
|
||||
throw new ApiException('用户端错误信息', 400);
|
||||
throw new AdminException('管理端错误信息', 500);
|
||||
|
||||
// 统一返回格式
|
||||
return $this->success($data);
|
||||
return $this->fail('错误信息');
|
||||
```
|
||||
|
||||
### 2. DAO层开发规范
|
||||
|
||||
#### 2.1 基础DAO结构
|
||||
```php
|
||||
class StoreOrderDao extends BaseDao
|
||||
{
|
||||
/**
|
||||
* 设置模型
|
||||
* @return string
|
||||
*/
|
||||
protected function setModel(): string
|
||||
{
|
||||
return StoreOrder::class;
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单搜索方法
|
||||
* @param array $where 搜索条件
|
||||
* @param bool $search 是否精确搜索
|
||||
* @return \crmeb\basic\BaseModel|mixed|\think\Model
|
||||
*/
|
||||
public function search(array $where = [], bool $search = false)
|
||||
{
|
||||
return parent::search($where, $search)
|
||||
->when(isset($where['status']), function ($query) use ($where) {
|
||||
$query->where('status', $where['status']);
|
||||
})
|
||||
->when(isset($where['paid']), function ($query) use ($where) {
|
||||
$query->where('paid', $where['paid']);
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Controller层开发规范
|
||||
|
||||
#### 3.1 基础Controller结构
|
||||
```php
|
||||
class StoreOrderController
|
||||
{
|
||||
/**
|
||||
* @var StoreOrderServices
|
||||
*/
|
||||
protected $services;
|
||||
|
||||
/**
|
||||
* 构造函数依赖注入
|
||||
* @param StoreOrderServices $services
|
||||
*/
|
||||
public function __construct(StoreOrderServices $services)
|
||||
{
|
||||
$this->services = $services;
|
||||
}
|
||||
|
||||
/**
|
||||
* 接口方法示例
|
||||
* @param Request $request
|
||||
* @return mixed
|
||||
*/
|
||||
public function apiMethod(Request $request)
|
||||
{
|
||||
// 1. 获取参数
|
||||
[$param1, $param2] = $request->postMore([
|
||||
'param1',
|
||||
['param2', 'defaultValue']
|
||||
], true);
|
||||
|
||||
// 2. 调用服务层
|
||||
$result = $this->services->businessMethod($param1, $param2);
|
||||
|
||||
// 3. 返回结果
|
||||
return app('json')->success($result);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 参数验证规范
|
||||
|
||||
#### 4.1 Validate层验证
|
||||
```php
|
||||
// 在 validate/order/ 目录下创建验证类
|
||||
class OrderValidate extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'order_id' => 'require|number',
|
||||
'status' => 'require|in:0,1,2,3',
|
||||
'pay_type' => 'require|in:wechat,alipay,balance'
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'order_id.require' => '订单ID不能为空',
|
||||
'order_id.number' => '订单ID必须是数字',
|
||||
'status.in' => '订单状态不正确'
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
## 🔍 关键业务场景实现
|
||||
|
||||
### 1. 库存管理
|
||||
```php
|
||||
// 订单创建时库存扣减
|
||||
public function reduceStock(array $cartInfo)
|
||||
{
|
||||
foreach ($cartInfo as $item) {
|
||||
$product = $this->productServices->get($item['product_id']);
|
||||
if ($product['stock'] < $item['cart_num']) {
|
||||
throw new ApiException('商品库存不足');
|
||||
}
|
||||
|
||||
// 扣减库存
|
||||
$this->productServices->decStock($item['product_id'], $item['cart_num']);
|
||||
|
||||
// 记录库存变更日志
|
||||
$this->productLogServices->createLog([
|
||||
'product_id' => $item['product_id'],
|
||||
'num' => -$item['cart_num'],
|
||||
'type' => 'order_reduce',
|
||||
'order_id' => $this->orderId
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 订单取消时库存恢复
|
||||
public function restoreStock(array $cartInfo)
|
||||
{
|
||||
foreach ($cartInfo as $item) {
|
||||
$this->productServices->incStock($item['product_id'], $item['cart_num']);
|
||||
|
||||
// 记录库存恢复日志
|
||||
$this->productLogServices->createLog([
|
||||
'product_id' => $item['product_id'],
|
||||
'num' => $item['cart_num'],
|
||||
'type' => 'order_restore',
|
||||
'order_id' => $this->orderId
|
||||
]);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 价格计算引擎
|
||||
```php
|
||||
class OrderPriceCalculator
|
||||
{
|
||||
public function calculate(array $params): array
|
||||
{
|
||||
// 1. 商品总价
|
||||
$totalPrice = $this->calculateProductTotal($params['cart_info']);
|
||||
|
||||
// 2. 运费计算
|
||||
$postage = $this->calculatePostage($params['cart_info'], $params['address']);
|
||||
|
||||
// 3. 优惠计算
|
||||
$discount = $this->calculateDiscount($params);
|
||||
|
||||
// 4. 最终价格
|
||||
$payPrice = $totalPrice + $postage - $discount;
|
||||
|
||||
return [
|
||||
'total_price' => $totalPrice,
|
||||
'postage' => $postage,
|
||||
'discount' => $discount,
|
||||
'pay_price' => $payPrice
|
||||
];
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 订单状态机
|
||||
```php
|
||||
class OrderStateMachine
|
||||
{
|
||||
const STATUS_TRANSITIONS = [
|
||||
self::STATUS_UNPAID => [self::STATUS_PAID, self::STATUS_CANCELLED],
|
||||
self::STATUS_PAID => [self::STATUS_SHIPPED, self::STATUS_REFUNDING],
|
||||
self::STATUS_SHIPPED => [self::STATUS_RECEIVED, self::STATUS_REFUNDING],
|
||||
self::STATUS_RECEIVED => [self::STATUS_COMPLETED, self::STATUS_REFUNDING],
|
||||
];
|
||||
|
||||
public function canTransition(int $from, int $to): bool
|
||||
{
|
||||
return in_array($to, self::STATUS_TRANSITIONS[$from] ?? []);
|
||||
}
|
||||
|
||||
public function transition(int $orderId, int $toStatus, string $reason = ''): bool
|
||||
{
|
||||
$order = $this->orderServices->get($orderId);
|
||||
|
||||
if (!$this->canTransition($order['status'], $toStatus)) {
|
||||
throw new ApiException('状态流转不合法');
|
||||
}
|
||||
|
||||
// 更新订单状态
|
||||
$this->orderServices->updateStatus($orderId, $toStatus);
|
||||
|
||||
// 记录状态变更日志
|
||||
$this->statusServices->createLog([
|
||||
'order_id' => $orderId,
|
||||
'from_status' => $order['status'],
|
||||
'to_status' => $toStatus,
|
||||
'reason' => $reason
|
||||
]);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 性能优化建议
|
||||
|
||||
### 1. 数据库优化
|
||||
- 订单表按时间分表存储
|
||||
- 建立复合索引优化查询性能
|
||||
- 使用缓存减少数据库访问
|
||||
|
||||
### 2. 缓存策略
|
||||
```php
|
||||
// 订单信息缓存
|
||||
$orderCacheKey = "order_info_{$orderId}";
|
||||
$orderInfo = Cache::remember($orderCacheKey, 3600, function() use ($orderId) {
|
||||
return $this->dao->get($orderId);
|
||||
});
|
||||
|
||||
// 订单状态缓存
|
||||
$statusCacheKey = "order_status_{$orderId}";
|
||||
$status = Cache::get($statusCacheKey);
|
||||
```
|
||||
|
||||
### 3. 异步处理
|
||||
```php
|
||||
// 订单创建后的异步处理
|
||||
public function afterOrderCreate(int $orderId)
|
||||
{
|
||||
// 发送邮件通知
|
||||
MailJob::dispatch($orderId);
|
||||
|
||||
// 更新用户等级
|
||||
UserLevelJob::dispatch($orderId);
|
||||
|
||||
// 统计数据更新
|
||||
StatisticJob::dispatch($orderId);
|
||||
}
|
||||
```
|
||||
|
||||
## 🧪 测试规范
|
||||
|
||||
### 1. 单元测试
|
||||
```php
|
||||
class StoreOrderServicesTest extends TestCase
|
||||
{
|
||||
public function testCreateOrder()
|
||||
{
|
||||
// 准备测试数据
|
||||
$orderData = [
|
||||
'uid' => 1,
|
||||
'cart_info' => [...],
|
||||
'address_id' => 1
|
||||
];
|
||||
|
||||
// 执行测试
|
||||
$result = $this->orderServices->createOrder($orderData);
|
||||
|
||||
// 断言结果
|
||||
$this->assertIsArray($result);
|
||||
$this->assertArrayHasKey('order_id', $result);
|
||||
$this->assertNotEmpty($result['order_id']);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 集成测试
|
||||
```php
|
||||
class OrderFlowTest extends TestCase
|
||||
{
|
||||
public function testCompleteOrderFlow()
|
||||
{
|
||||
// 1. 创建订单
|
||||
$order = $this->createTestOrder();
|
||||
|
||||
// 2. 支付订单
|
||||
$this->payOrder($order['order_id']);
|
||||
|
||||
// 3. 发货
|
||||
$this->shipOrder($order['order_id']);
|
||||
|
||||
// 4. 确认收货
|
||||
$this->confirmOrder($order['order_id']);
|
||||
|
||||
// 5. 验证订单状态
|
||||
$finalOrder = $this->orderServices->get($order['order_id']);
|
||||
$this->assertEquals(StoreOrderServices::STATUS_COMPLETED, $finalOrder['status']);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📝 开发检查清单
|
||||
|
||||
### 订单开发前检查
|
||||
- [ ] 理解业务需求和订单流程
|
||||
- [ ] 设计数据库表结构
|
||||
- [ ] 确认状态流转规则
|
||||
- [ ] 设计接口参数和返回格式
|
||||
|
||||
### 代码开发检查
|
||||
- [ ] 遵循项目架构规范
|
||||
- [ ] 实现完整的异常处理
|
||||
- [ ] 添加必要的日志记录
|
||||
- [ ] 实现参数验证
|
||||
- [ ] 编写业务逻辑注释
|
||||
|
||||
### 测试验证检查
|
||||
- [ ] 单元测试覆盖核心逻辑
|
||||
- [ ] 集成测试验证完整流程
|
||||
- [ ] 性能测试确保响应时间
|
||||
- [ ] 边界条件测试
|
||||
|
||||
### 部署上线检查
|
||||
- [ ] 数据库迁移脚本
|
||||
- [ ] 缓存预热脚本
|
||||
- [ ] 监控指标配置
|
||||
- [ ] 回滚方案准备
|
||||
|
||||
## 🔮 扩展建议
|
||||
|
||||
### 1. 微服务拆分
|
||||
- 订单服务独立部署
|
||||
- 库存服务独立部署
|
||||
- 支付服务独立部署
|
||||
|
||||
### 2. 消息队列集成
|
||||
- 使用RabbitMQ/Redis队列处理异步任务
|
||||
- 实现订单事件驱动架构
|
||||
|
||||
### 3. 分布式事务
|
||||
- 使用Seata处理跨服务事务
|
||||
- 实现最终一致性方案
|
||||
|
||||
### 4. 大数据分析
|
||||
- 订单数据实时统计
|
||||
- 用户行为分析
|
||||
- 销售预测分析
|
||||
|
||||
这份文档涵盖了CRMEB订单系统的完整开发流程,为开发团队提供了详细的指导。在实际开发中,请根据具体业务需求进行相应的调整和扩展。
|
||||
@ -1,73 +0,0 @@
|
||||
# CRMEB 订单开发流程实施任务计划
|
||||
|
||||
- [x] 任务1:文档验证与代码结构分析
|
||||
- 1.1: 验证文档中描述的文件路径与实际项目结构的一致性
|
||||
- 1.2: 检查订单相关的Service、DAO、Controller类是否存在并符合文档描述
|
||||
- 1.3: 验证数据库表结构是否与文档中的设计一致
|
||||
- 1.4: 分析现有代码实现与文档规范的差异点
|
||||
|
||||
- [ ] 任务2:订单状态流转机制完善
|
||||
- 2.1: 实现文档描述的OrderStateMachine状态机类
|
||||
- 2.2: 在StoreOrderServices中集成状态机验证逻辑
|
||||
- 2.3: 完善订单状态变更的日志记录机制
|
||||
- 2.4: 添加状态流转的单元测试用例
|
||||
|
||||
- [ ] 任务3:价格计算引擎优化
|
||||
- 3.1: 创建OrderPriceCalculator独立价格计算类
|
||||
- 3.2: 重构StoreOrderComputedServices使用新的计算引擎
|
||||
- 3.3: 实现会员折扣、优惠券、积分等复杂优惠计算逻辑
|
||||
- 3.4: 添加价格计算的边界测试和性能优化
|
||||
|
||||
- [ ] 任务4:库存管理模块增强
|
||||
- 4.1: 完善订单创建时的库存扣减逻辑
|
||||
- 4.2: 实现订单取消/退款时的库存恢复机制
|
||||
- 4.3: 添加库存变更的详细日志记录
|
||||
- 4.4: 实现库存预警和并发控制机制
|
||||
|
||||
- [ ] 任务5:异常处理与参数验证规范化
|
||||
- 5.1: 为订单相关接口创建完整的Validate验证类
|
||||
- 5.2: 统一订单模块的异常处理机制
|
||||
- 5.3: 完善API错误码和错误信息的标准化
|
||||
- 5.4: 添加接口参数验证的集成测试
|
||||
|
||||
- [ ] 任务6:缓存策略实现
|
||||
- 6.1: 实现订单信息的Redis缓存机制
|
||||
- 6.2: 添加订单状态的缓存更新策略
|
||||
- 6.3: 实现缓存失效和预热机制
|
||||
- 6.4: 添加缓存性能监控和优化
|
||||
|
||||
- [ ] 任务7:异步处理任务开发
|
||||
- 7.1: 创建订单创建后的异步邮件通知Job
|
||||
- 7.2: 实现用户等级更新的异步处理Job
|
||||
- 7.3: 添加统计数据更新的异步处理Job
|
||||
- 7.4: 配置队列处理器和失败重试机制
|
||||
|
||||
- [ ] 任务8:订单退款流程完善
|
||||
- 8.1: 优化部分退款和整单退款的业务逻辑
|
||||
- 8.2: 完善退款审核流程和状态管理
|
||||
- 8.3: 实现退款金额计算和验证机制
|
||||
- 8.4: 添加退款流程的完整测试用例
|
||||
|
||||
- [ ] 任务9:物流跟踪功能增强
|
||||
- 9.1: 集成第三方物流查询API
|
||||
- 9.2: 实现物流信息的自动更新机制
|
||||
- 9.3: 添加物流异常状态监控
|
||||
- 9.4: 完善电子面单和发货通知功能
|
||||
|
||||
- [ ] 任务10:监控与日志系统完善
|
||||
- 10.1: 实现订单操作的全链路日志记录
|
||||
- 10.2: 添加订单关键指标的业务监控
|
||||
- 10.3: 实现订单异常的实时告警机制
|
||||
- 10.4: 添加订单数据统计的定时任务
|
||||
|
||||
- [ ] 任务11:API文档与测试覆盖
|
||||
- 11.1: 为所有订单相关API生成完整的接口文档
|
||||
- 11.2: 编写订单业务流程的集成测试
|
||||
- 11.3: 添加API性能测试和压力测试
|
||||
- 11.4: 实现自动化测试的CI/CD集成
|
||||
|
||||
- [ ] 任务12:数据库优化与分表准备
|
||||
- 12.1: 分析订单表的查询性能瓶颈
|
||||
- 12.2: 设计订单表的历史数据分表方案
|
||||
- 12.3: 实现分表查询的DAO层适配
|
||||
- 12.4: 添加数据迁移和清理脚本
|
||||
@ -1,331 +0,0 @@
|
||||
# CRMEB订单流程开发文档
|
||||
|
||||
## 1. 订单流程概述
|
||||
|
||||
CRMEB系统订单流程是一个完整的电商交易处理系统,涵盖从用户下单到订单完成的全生命周期管理。系统支持多种商品类型(普通商品、秒杀、拼团、砍价、预售)、多种支付方式和配送方式,并集成了推广佣金、退款处理等功能。
|
||||
|
||||
## 2. 核心架构技术方案
|
||||
|
||||
### 2.1 系统架构
|
||||
- **MVC架构**: 基于ThinkPHP6框架
|
||||
- **服务层设计**: 采用Services层处理业务逻辑,Dao层数据访问
|
||||
- **队列处理**: 使用ThinkPHP队列处理异步任务(如自动评价、订单取消)
|
||||
- **事务管理**: 关键操作使用数据库事务保证数据一致性
|
||||
|
||||
### 2.2 核心模块
|
||||
- **订单管理**: StoreOrder模型和StoreOrderServices服务
|
||||
- **购物车**: StoreCartServices处理购物车逻辑
|
||||
- **支付处理**: 支持微信支付、支付宝、余额支付、线下支付
|
||||
- **物流管理**: 快递发货、门店自提、虚拟发货
|
||||
- **退款管理**: StoreOrderRefund处理退款申请和流程
|
||||
- **推广佣金**: 多级分销体系,支持事业部、代理、员工分佣
|
||||
|
||||
## 3. 影响文件分析
|
||||
|
||||
### 3.1 核心模型文件
|
||||
- `crmeb/app/model/order/StoreOrder.php` - 订单主模型,包含订单基础信息和关联关系
|
||||
- `crmeb/app/model/order/StoreOrderStatus.php` - 订单状态变更记录
|
||||
- `crmeb/app/model/order/StoreOrderRefund.php` - 退款订单模型
|
||||
- `crmeb/app/model/order/StoreOrderCartInfo.php` - 订单商品信息模型
|
||||
|
||||
### 3.2 服务层文件
|
||||
- `crmeb/app/services/order/StoreOrderServices.php` - 订单核心业务逻辑(3086行)
|
||||
- `crmeb/app/services/pay/OrderPayServices.php` - 支付处理服务
|
||||
- `crmeb/app/services/pay/PayNotifyServices.php` - 支付回调处理
|
||||
- `crmeb/app/services/user/UserBillServices.php` - 用户账单处理
|
||||
|
||||
### 3.3 控制器文件
|
||||
- `crmeb/app/adminapi/controller/order/` - 后台订单管理控制器
|
||||
- `crmeb/app/api/controller/order/` - 前端订单API控制器
|
||||
|
||||
### 3.4 数据库表结构
|
||||
- `eb_store_order` - 订单主表(72个字段)
|
||||
- `eb_store_order_cart_info` - 订单商品明细表
|
||||
- `eb_store_order_status` - 订单状态变更记录表
|
||||
- `eb_store_order_refund` - 退款订单表
|
||||
|
||||
## 4. 实现细节
|
||||
|
||||
### 4.1 订单状态流转
|
||||
```php
|
||||
// 订单状态定义
|
||||
const ORDER_STATUS = [
|
||||
-2 => '退货成功',
|
||||
-1 => '申请退款/已退款',
|
||||
0 => '待发货',
|
||||
1 => '待收货',
|
||||
2 => '已收货',
|
||||
3 => '待评价'
|
||||
];
|
||||
|
||||
// 支付状态
|
||||
const PAY_STATUS = [
|
||||
0 => '未支付',
|
||||
1 => '已支付'
|
||||
];
|
||||
|
||||
// 退款状态
|
||||
const REFUND_STATUS = [
|
||||
0 => '未退款',
|
||||
1 => '申请中',
|
||||
2 => '已退款'
|
||||
];
|
||||
```
|
||||
|
||||
### 4.2 订单创建流程
|
||||
```php
|
||||
public function createOrder($data) {
|
||||
// 1. 验证商品库存和价格
|
||||
$this->checkProductStock($data['cart_info']);
|
||||
|
||||
// 2. 计算订单金额(含优惠券、积分抵扣)
|
||||
$orderData = $this->calculateOrderPrice($data);
|
||||
|
||||
// 3. 生成订单号和唯一标识
|
||||
$orderData['order_id'] = $this->generateOrderId();
|
||||
$orderData['unique'] = md5(uniqid(mt_rand(), true));
|
||||
|
||||
// 4. 处理优惠券使用
|
||||
if ($orderData['coupon_id']) {
|
||||
$this->useCoupon($orderData['coupon_id'], $orderData['uid']);
|
||||
}
|
||||
|
||||
// 5. 扣减库存
|
||||
$this->reduceStock($data['cart_info']);
|
||||
|
||||
// 6. 创建订单记录
|
||||
$order = $this->dao->save($orderData);
|
||||
|
||||
// 7. 创建订单商品明细
|
||||
$this->createOrderCartInfo($order['id'], $data['cart_info']);
|
||||
|
||||
// 8. 记录订单状态变更
|
||||
$this->recordOrderStatus($order['id'], 'create', '订单创建');
|
||||
|
||||
return $order;
|
||||
}
|
||||
```
|
||||
|
||||
### 4.3 支付处理流程
|
||||
```php
|
||||
public function paySuccess($orderId, $payType, $tradeNo = '') {
|
||||
// 开启事务
|
||||
Db::startTrans();
|
||||
try {
|
||||
// 1. 更新订单支付状态
|
||||
$this->dao->update($orderId, [
|
||||
'paid' => 1,
|
||||
'pay_time' => time(),
|
||||
'pay_type' => $payType,
|
||||
'trade_no' => $tradeNo
|
||||
]);
|
||||
|
||||
// 2. 处理推广佣金
|
||||
$this->handleBrokerage($orderId);
|
||||
|
||||
// 3. 增加用户积分
|
||||
$this->addUserIntegral($orderId);
|
||||
|
||||
// 4. 更新会员等级和经验
|
||||
$this->updateUserLevel($orderId);
|
||||
|
||||
// 5. 处理拼团逻辑
|
||||
if ($orderInfo['pink_id']) {
|
||||
app()->make(StorePinkServices::class)->handlePinkPay($orderInfo);
|
||||
}
|
||||
|
||||
// 6. 发送消息通知
|
||||
$this->sendPaySuccessNotice($orderId);
|
||||
|
||||
Db::commit();
|
||||
return true;
|
||||
} catch (\Exception $e) {
|
||||
Db::rollback();
|
||||
throw new \Exception('支付处理失败: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4.4 发货处理流程
|
||||
```php
|
||||
public function delivery($orderId, $deliveryData) {
|
||||
// 1. 验证订单状态
|
||||
$order = $this->dao->get($orderId);
|
||||
if (!$order || $order['paid'] != 1 || $order['status'] != 0) {
|
||||
throw new ApiException('订单状态不允许发货');
|
||||
}
|
||||
|
||||
// 2. 处理不同发货类型
|
||||
switch ($deliveryData['delivery_type']) {
|
||||
case 'express': // 快递发货
|
||||
$updateData = [
|
||||
'delivery_name' => $deliveryData['delivery_name'],
|
||||
'delivery_id' => $deliveryData['delivery_id'],
|
||||
'delivery_type' => 'express',
|
||||
'status' => 1 // 待收货
|
||||
];
|
||||
break;
|
||||
|
||||
case 'send': // 商家配送
|
||||
$updateData = [
|
||||
'delivery_name' => $deliveryData['delivery_name'],
|
||||
'delivery_id' => $deliveryData['delivery_id'],
|
||||
'delivery_type' => 'send',
|
||||
'status' => 1,
|
||||
'delivery_uid' => $deliveryData['delivery_uid']
|
||||
];
|
||||
break;
|
||||
|
||||
case 'fictitious': // 虚拟发货
|
||||
$updateData = [
|
||||
'fictitious_content' => $deliveryData['fictitious_content'],
|
||||
'delivery_type' => 'fictitious',
|
||||
'status' => 2 // 直接完成
|
||||
];
|
||||
break;
|
||||
}
|
||||
|
||||
// 3. 更新订单状态
|
||||
$this->dao->update($orderId, $updateData);
|
||||
|
||||
// 4. 记录订单状态变更
|
||||
$this->recordOrderStatus($orderId, 'delivery', '订单发货');
|
||||
|
||||
// 5. 发送发货通知
|
||||
$this->sendDeliveryNotice($orderId);
|
||||
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
### 4.5 退款处理流程
|
||||
```php
|
||||
public function applyRefund($orderId, $refundData) {
|
||||
// 1. 验证订单和退款条件
|
||||
$order = $this->validateRefundCondition($orderId);
|
||||
|
||||
// 2. 创建退款记录
|
||||
$refundData = [
|
||||
'store_order_id' => $orderId,
|
||||
'refund_type' => $refundData['refund_type'],
|
||||
'refund_price' => $refundData['refund_price'],
|
||||
'refund_reason' => $refundData['refund_reason'],
|
||||
'refund_reason_wap_explain' => $refundData['explain'] ?? '',
|
||||
'refund_reason_wap_img' => $refundData['images'] ?? '',
|
||||
'add_time' => time()
|
||||
];
|
||||
|
||||
$refund = app()->make(StoreOrderRefundServices::class)->save($refundData);
|
||||
|
||||
// 3. 更新订单退款状态
|
||||
$this->dao->update($orderId, [
|
||||
'refund_status' => 1, // 申请中
|
||||
'refund_type' => $refundData['refund_type']
|
||||
]);
|
||||
|
||||
// 4. 记录订单状态变更
|
||||
$this->recordOrderStatus($orderId, 'apply_refund', '申请退款');
|
||||
|
||||
// 5. 发送退款申请通知
|
||||
$this->sendRefundApplyNotice($orderId, $refund['id']);
|
||||
|
||||
return $refund;
|
||||
}
|
||||
```
|
||||
|
||||
## 5. 边界条件与异常处理
|
||||
|
||||
### 5.1 库存管理
|
||||
- **超卖防护**: 使用Redis分布式锁或数据库乐观锁防止超卖
|
||||
- **库存回滚**: 订单取消或支付失败时自动回滚库存
|
||||
- **预售商品**: 支持预售商品的库存管理
|
||||
|
||||
### 5.2 支付安全
|
||||
- **重复支付防护**: 通过订单唯一标识防止重复支付
|
||||
- **支付超时**: 未支付订单自动取消(可配置超时时间)
|
||||
- **金额校验**: 支付回调时校验金额一致性
|
||||
|
||||
### 5.3 退款控制
|
||||
- **退款时限**: 根据商品类型设置不同的退款时限
|
||||
- **退款次数**: 限制同一订单的退款申请次数
|
||||
- **权限控制**: 不同角色处理退款的权限控制
|
||||
|
||||
### 5.4 异常处理机制
|
||||
```php
|
||||
// 订单创建异常处理
|
||||
try {
|
||||
$order = $this->createOrder($orderData);
|
||||
} catch (\Exception $e) {
|
||||
// 记录错误日志
|
||||
Log::error('订单创建失败: ' . $e->getMessage(), ['data' => $orderData]);
|
||||
|
||||
// 回滚已处理的数据
|
||||
if (isset($orderData['coupon_id'])) {
|
||||
$this->rollbackCoupon($orderData['coupon_id']);
|
||||
}
|
||||
|
||||
throw new ApiException('订单创建失败,请重试');
|
||||
}
|
||||
```
|
||||
|
||||
## 6. 数据流动路径
|
||||
|
||||
### 6.1 订单创建数据流
|
||||
```
|
||||
用户下单 → 购物车验证 → 价格计算 → 订单生成 → 库存扣减 → 支付处理 → 订单确认
|
||||
```
|
||||
|
||||
### 6.2 支付处理数据流
|
||||
```
|
||||
支付请求 → 支付网关 → 支付回调 → 订单状态更新 → 佣金计算 → 积分奖励 → 消息通知
|
||||
```
|
||||
|
||||
### 6.3 发货处理数据流
|
||||
```
|
||||
发货操作 → 物流信息更新 → 订单状态变更 → 状态记录 → 用户通知 → 物流跟踪
|
||||
```
|
||||
|
||||
### 6.4 退款处理数据流
|
||||
```
|
||||
退款申请 → 条件验证 → 退款记录 → 状态更新 → 退款处理 → 资金返还 → 完成通知
|
||||
```
|
||||
|
||||
## 7. 预期成果
|
||||
|
||||
### 7.1 功能完整性
|
||||
- ✅ 支持多种商品类型的订单处理
|
||||
- ✅ 完整的订单状态流转机制
|
||||
- ✅ 多种支付方式和配送方式
|
||||
- ✅ 完善的退款处理流程
|
||||
- ✅ 推广佣金自动计算
|
||||
- ✅ 积分和会员等级体系
|
||||
|
||||
### 7.2 系统性能
|
||||
- 订单处理响应时间 < 200ms
|
||||
- 支持高并发订单创建(使用队列异步处理)
|
||||
- 数据库查询优化,关键索引完备
|
||||
- 缓存策略应用,减少数据库压力
|
||||
|
||||
### 7.3 安全性
|
||||
- 防重复支付机制
|
||||
- 订单数据加密存储
|
||||
- 敏感信息脱敏处理
|
||||
- 完整的日志审计
|
||||
|
||||
### 7.4 扩展性
|
||||
- 模块化设计,便于功能扩展
|
||||
- 插件化支付和物流接口
|
||||
- 灵活的订单状态配置
|
||||
- 支持多种业务场景定制
|
||||
|
||||
## 8. 技术要点总结
|
||||
|
||||
1. **数据一致性**: 关键操作使用数据库事务保证
|
||||
2. **异步处理**: 耗时操作使用队列异步执行
|
||||
3. **状态机**: 订单状态流转严格遵循状态机模式
|
||||
4. **缓存策略**: 商品信息、用户信息等使用缓存提升性能
|
||||
5. **日志记录**: 完整的操作日志便于问题排查
|
||||
6. **异常处理**: 完善的异常处理和回滚机制
|
||||
7. **监控告警**: 关键指标监控和异常告警机制
|
||||
|
||||
该订单流程设计具备高可用性、高性能、高安全性的特点,能够满足大型电商平台的业务需求。
|
||||
Loading…
x
Reference in New Issue
Block a user