chore: 删除旧的订单开发流程文档和任务计划文件

This commit is contained in:
sugar1569 2026-01-27 09:59:45 +08:00
parent fb32d31fc1
commit d063cb2225
3 changed files with 0 additions and 1081 deletions

View File

@ -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订单系统的完整开发流程,为开发团队提供了详细的指导。在实际开发中,请根据具体业务需求进行相应的调整和扩展。

View File

@ -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: 添加数据迁移和清理脚本

View File

@ -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. **监控告警**: 关键指标监控和异常告警机制
该订单流程设计具备高可用性、高性能、高安全性的特点,能够满足大型电商平台的业务需求。