init: import production code mss.nahaichuan.com (exclude Runtime/Uploads/backups/logs)

这个提交包含在:
Developer
2026-10-30 10:18:50 +08:00
当前提交 1f3e0ce2f6
共有 9291 个文件被更改,包括 1776674 次插入 和 0 次删除

查看文件

@@ -0,0 +1,567 @@
# 宝塔面板 Supervisor 配置订单同步任务指南
## 概述
本文档介绍如何在宝塔面板中使用 **Supervisor 进程守护管理器** 配置订单双向同步任务。
**为什么使用 Supervisor 而不是计划任务?**
- 宝塔计划任务可能存在路径识别问题
- Supervisor 提供更稳定的进程管理
- 自动重启、开机自启等高级功能
- 更好的日志管理和监控
## 前置条件
### 1. 安装 Supervisor 管理器
1. 登录宝塔面板
2. 点击 **软件商店**
3. 搜索 **"Supervisor管理器"**
4. 点击 **"安装"**
### 2. 创建守护脚本
在SSH中执行以下命令:
```bash
# 进入项目目录
cd /www/wwwroot/mss.nahaichuan.com
# 创建守护脚本
cat > order_sync_daemon.sh << 'EOF'
#!/bin/bash
# 订单同步守护脚本
# 每5分钟执行一次双向同步任务
# 项目路径
PROJECT_DIR="/www/wwwroot/mss.nahaichuan.com"
# 日志目录
LOG_DIR="/www/wwwroot/mss.nahaichuan.com/Runtime/Logs/OrderSync"
mkdir -p $LOG_DIR
# 无限循环
while true; do
echo "========================================" >> $LOG_DIR/daemon.log
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始执行订单同步任务" >> $LOG_DIR/daemon.log
cd $PROJECT_DIR
# 1. 正向同步:原订单 → 骑手端(创建可接订单)
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 执行正向同步(原订单→骑手端)..." >> $LOG_DIR/daemon.log
php index.php /Cli/OrderSync/batchSync >> $LOG_DIR/daemon.log 2>&1
echo "" >> $LOG_DIR/daemon.log
# 2. 反向同步:骑手端 → 原订单(更新订单状态)
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 执行反向同步(骑手端→原订单)..." >> $LOG_DIR/daemon.log
php index.php /Cli/OrderSync/syncRiderOrderStatus >> $LOG_DIR/daemon.log 2>&1
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 双向同步完成,等待下次执行..." >> $LOG_DIR/daemon.log
echo "" >> $LOG_DIR/daemon.log
# 休眠5分钟(300秒)
sleep 300
done
EOF
# 赋予执行权限
chmod +x order_sync_daemon.sh
```
### 3. 测试脚本
在启用 Supervisor 之前,先手动测试脚本是否正常:
```bash
# 测试正向同步
cd /www/wwwroot/mss.nahaichuan.com
php index.php /Cli/OrderSync/batchSync
# 测试反向同步
php index.php /Cli/OrderSync/syncRiderOrderStatus
```
如果都能正常执行,再继续下一步。
## Supervisor 配置步骤
### 方法一:使用宝塔界面配置(推荐)
#### 1. 打开 Supervisor 管理器
1. 登录宝塔面板
2. 点击左侧菜单 **"软件商店"**
3. 找到已安装的 **"Supervisor管理器"**
4. 点击 **"设置"** 按钮
#### 2. 添加守护进程
点击 **"添加守护进程"** 按钮,填写以下信息:
| 配置项 | 值 | 说明 |
|--------|-----|------|
| **名称** | `order_sync` | 进程名称,可自定义 |
| **运行目录** | `/www/wwwroot/mss.nahaichuan.com` | 项目根目录 |
| **启动命令** | `/bin/bash /www/wwwroot/mss.nahaichuan.com/order_sync_daemon.sh` | 守护脚本完整路径 |
| **进程数量** | `1` | 只需要1个进程 |
| **用户** | `www` 或 `root` | 运行用户 |
**配置示例截图说明:**
```
┌──────────────────────────────────────────────┐
│ 添加守护进程 │
├──────────────────────────────────────────────┤
│ 名称: order_sync │
│ │
│ 运行目录: /www/wwwroot/mss.nahaichuan.com│
│ │
│ 启动命令: /bin/bash │
│ /www/wwwroot/mss.nahaichuan.com/│
│ order_sync_daemon.sh │
│ │
│ 进程数量: 1 │
│ │
│ 用户: www │
│ │
│ [取消] [提交] │
└──────────────────────────────────────────────┘
```
#### 3. 启动进程
1. 提交配置后,会在进程列表中看到 `order_sync`
2. 状态显示为 **"已停止"**
3. 点击 **"启动"** 按钮
4. 状态变为 **"运行中"** 表示成功
### 方法二:使用配置文件(高级)
#### 1. 进入配置文件
在 Supervisor 管理器界面,点击 **"配置修改"** 标签。
#### 2. 添加配置
在配置文件末尾添加:
```ini
[program:order_sync]
# 进程名称
command=/bin/bash /www/wwwroot/mss.nahaichuan.com/order_sync_daemon.sh
# 运行目录
directory=/www/wwwroot/mss.nahaichuan.com
# 运行用户
user=www
# 自动启动
autostart=true
# 自动重启
autorestart=true
# 启动等待时间(秒)
startsecs=5
# 停止等待时间(秒)
stopwaitsecs=10
# 重启次数限制
startretries=3
# 重定向stderr到stdout
redirect_stderr=true
# 日志文件路径
stdout_logfile=/www/wwwroot/mss.nahaichuan.com/Runtime/Logs/OrderSync/supervisor.log
# 日志文件大小限制(50MB)
stdout_logfile_maxbytes=50MB
# 保留日志文件数量
stdout_logfile_backups=10
```
#### 3. 重载配置
```bash
# SSH中执行
supervisorctl reread
supervisorctl update
supervisorctl start order_sync
```
## 同步任务说明
守护脚本会每5分钟自动执行以下**两个同步任务**:
### 1. 正向同步(batchSync)
**原订单系统 → 骑手端**
```bash
php index.php /Cli/OrderSync/batchSync
```
- **作用:** 将待发货订单推送到骑手端
- **触发条件:** 原订单状态为"待发货"(status = 1)
- **同步结果:** 在骑手端创建"待接单"订单(order_status = 0)
### 2. 反向同步(syncRiderOrderStatus)
**骑手端 → 原订单系统**
```bash
php index.php /Cli/OrderSync/syncRiderOrderStatus
```
- **作用:** 将骑手操作状态同步回原订单
- **同步逻辑:**
- 骑手接单(order_status = 1-5)→ 原订单"已发货"(status = 2)
- 骑手送达(order_status = 6)→ 原订单"已完成"(status = 3)
## 日志管理
### 1. 查看守护脚本日志
**方法一:宝塔界面查看**
1. Supervisor管理器 → 找到 `order_sync` 进程
2. 点击 **"日志"** 按钮
**方法二:SSH查看**
```bash
# 实时查看日志
tail -f /www/wwwroot/mss.nahaichuan.com/Runtime/Logs/OrderSync/daemon.log
# 查看最近100行
tail -n 100 /www/wwwroot/mss.nahaichuan.com/Runtime/Logs/OrderSync/daemon.log
# 按日期查看
grep "2025-10-29" /www/wwwroot/mss.nahaichuan.com/Runtime/Logs/OrderSync/daemon.log
```
### 2. 查看 Supervisor 日志
```bash
tail -f /www/wwwroot/mss.nahaichuan.com/Runtime/Logs/OrderSync/supervisor.log
```
### 3. 日志示例
正常运行的日志应该类似:
```
========================================
[2025-10-29 15:00:00] 开始执行订单同步任务
[2025-10-29 15:00:00] 执行正向同步(原订单→骑手端)...
===== 批量同步任务开始 =====
开始时间:2025-10-29 15:00:00
找到 3 个待同步订单
✓ 订单 2831 同步成功
✓ 订单 2832 同步成功
✓ 订单 2833 同步成功
批量同步完成:成功 3 个,失败 0 个
===== 同步任务完成 =====
[2025-10-29 15:00:00] 执行反向同步(骑手端→原订单)...
===== 订单状态同步任务开始 =====
开始时间:2025-10-29 15:00:00
自动同步已启用,开始执行...
找到 2 个待同步的接单订单
✓ 订单 2625 状态已更新为发货
✓ 订单 2683 状态已更新为发货
接单状态同步:成功 2 个,失败 0 个
找到 1 个待同步的完成订单
✓ 订单 2701 状态已更新为完成
完成状态同步:成功 1 个,失败 0 个
===== 同步任务完成 =====
[2025-10-29 15:00:01] 双向同步完成,等待下次执行...
[2025-10-29 15:05:00] 开始执行订单同步任务
...
```
## 进程管理
### 宝塔界面操作
在 Supervisor 管理器的进程列表中:
| 操作 | 按钮/方法 | 说明 |
|------|----------|------|
| **启动** | 点击"启动"按钮 | 启动已停止的进程 |
| **停止** | 点击"停止"按钮 | 停止运行中的进程 |
| **重启** | 点击"重启"按钮 | 重启进程(配置修改后) |
| **查看日志** | 点击"日志"按钮 | 查看进程输出日志 |
| **删除** | 点击"删除"按钮 | 删除进程配置 |
### SSH 命令操作
```bash
# 查看状态
supervisorctl status order_sync
# 启动进程
supervisorctl start order_sync
# 停止进程
supervisorctl stop order_sync
# 重启进程
supervisorctl restart order_sync
# 查看所有进程
supervisorctl status
# 重新加载配置
supervisorctl reread
supervisorctl update
```
## 修改同步频率
如果需要修改执行间隔,编辑守护脚本:
```bash
vi /www/wwwroot/mss.nahaichuan.com/order_sync_daemon.sh
```
找到 `sleep 300` 这一行,修改为:
| 间隔时间 | 配置值 | 说明 |
|---------|--------|------|
| 1分钟 | `sleep 60` | 适合订单量大、要求实时性高的场景 |
| 3分钟 | `sleep 180` | 平衡性能和实时性 |
| 5分钟 | `sleep 300` | 默认配置,推荐 |
| 10分钟 | `sleep 600` | 适合订单量小的场景 |
**修改后重启进程:**
```bash
supervisorctl restart order_sync
```
或在宝塔界面点击 **"重启"** 按钮。
## 状态监控
### 1. 检查进程是否运行
**宝塔界面:**
- Supervisor管理器 → 查看 `order_sync` 状态
- 显示"运行中"且有运行时长
**SSH命令:**
```bash
# 查看 Supervisor 状态
supervisorctl status order_sync
# 查看系统进程
ps aux | grep order_sync_daemon
# 查看进程数
ps aux | grep order_sync_daemon | grep -v grep | wc -l
```
### 2. 验证同步是否正常
```bash
# 查看最近的同步记录
tail -n 50 /www/wwwroot/mss.nahaichuan.com/Runtime/Logs/OrderSync/daemon.log
# 查看数据库同步日志表
mysql -u用户名 -p密码 -e "SELECT * FROM 数据库名.ls_rider_order_sync_log ORDER BY add_time DESC LIMIT 10;"
```
### 3. 设置告警(可选)
可以编写监控脚本,定期检查:
- 进程是否运行
- 日志是否有错误
- 最近一次同步时间
## 故障排查
### 问题1:进程无法启动
**现象:** 点击启动后立即停止,或状态显示"FATAL"
**排查步骤:**
1. **查看 Supervisor 日志**
```bash
tail -f /www/server/supervisor/logs/order_sync.log
```
2. **检查脚本权限**
```bash
ls -l /www/wwwroot/mss.nahaichuan.com/order_sync_daemon.sh
# 应显示 -rwxr-xr-x
# 如果没有执行权限,添加:
chmod +x /www/wwwroot/mss.nahaichuan.com/order_sync_daemon.sh
```
3. **检查脚本语法**
```bash
bash -n /www/wwwroot/mss.nahaichuan.com/order_sync_daemon.sh
# 无输出表示语法正确
```
4. **手动执行测试**
```bash
/bin/bash /www/wwwroot/mss.nahaichuan.com/order_sync_daemon.sh
# 等待几分钟,按Ctrl+C停止
# 查看是否有错误输出
```
### 问题2:同步任务未执行
**现象:** 进程运行中,但日志没有更新
**排查步骤:**
1. **检查日志目录权限**
```bash
ls -ld /www/wwwroot/mss.nahaichuan.com/Runtime/Logs/OrderSync/
# 确保www用户有写入权限
# 如果没有,创建并设置权限:
mkdir -p /www/wwwroot/mss.nahaichuan.com/Runtime/Logs/OrderSync/
chown -R www:www /www/wwwroot/mss.nahaichuan.com/Runtime/Logs/
chmod -R 755 /www/wwwroot/mss.nahaichuan.com/Runtime/Logs/
```
2. **检查PHP路径**
```bash
which php
# 输出PHP路径,如:/usr/bin/php
# 如果找不到,安装或配置PATH
```
3. **手动执行同步命令**
```bash
cd /www/wwwroot/mss.nahaichuan.com
php index.php /Cli/OrderSync/batchSync
php index.php /Cli/OrderSync/syncRiderOrderStatus
```
### 问题3:同步失败
**现象:** 日志显示执行了,但同步失败
**排查步骤:**
1. **查看详细错误日志**
```bash
cat /www/wwwroot/mss.nahaichuan.com/Runtime/Logs/OrderSync/daemon.log | grep -i "error\|fail\|exception"
```
2. **检查数据库配置**
```bash
# 查看数据库配置文件
cat /www/wwwroot/mss.nahaichuan.com/Application/Common/Conf/config.php | grep -A 5 "DB_"
```
3. **检查 auto_sync_enabled 配置**
```sql
SELECT * FROM ls_rider_config WHERE merchant_id = 0;
-- 确保 auto_sync_enabled = 1
```
4. **查看同步日志表**
```sql
SELECT * FROM ls_rider_order_sync_log
WHERE sync_result = 0
ORDER BY add_time DESC
LIMIT 10;
-- 查看失败原因
```
### 问题4:服务器重启后进程未启动
**原因:** Supervisor 服务未设置开机自启
**解决方法:**
```bash
# 检查 Supervisor 服务状态
systemctl status supervisord
# 设置开机自启
systemctl enable supervisord
# 启动服务
systemctl start supervisord
```
## 性能优化建议
### 1. 数据库索引
确保相关表有索引,提升查询性能:
```sql
-- ls_retail_bill_online 表
ALTER TABLE ls_retail_bill_online ADD INDEX idx_status_time (status, add_time);
-- ls_rider_order 表
ALTER TABLE ls_rider_order ADD INDEX idx_order_status (order_status, bill_id);
ALTER TABLE ls_rider_order ADD INDEX idx_sync_status (is_synced);
-- ls_rider_order_sync_log 表
ALTER TABLE ls_rider_order_sync_log ADD INDEX idx_sync_result (sync_result, sync_time);
```
### 2. 日志清理
定期清理旧日志,避免占用过多磁盘空间:
```bash
# 创建日志清理脚本
cat > /www/wwwroot/mss.nahaichuan.com/clean_logs.sh << 'EOF'
#!/bin/bash
# 删除30天前的日志
find /www/wwwroot/mss.nahaichuan.com/Runtime/Logs/OrderSync/ -name "*.log" -mtime +30 -delete
echo "[$(date)] 日志清理完成"
EOF
chmod +x /www/wwwroot/mss.nahaichuan.com/clean_logs.sh
# 添加到crontab,每天凌晨3点执行
# 0 3 * * * /www/wwwroot/mss.nahaichuan.com/clean_logs.sh
```
### 3. 调整执行频率
根据业务量调整:
- **订单量大**:缩短间隔(1-3分钟)
- **订单量小**:延长间隔(5-10分钟)
- **非营业时段**:可以暂停同步
## 安全建议
1. **使用 www 用户运行**
- 避免使用 root 用户
- 限制文件访问权限
2. **日志敏感信息**
- 不要在日志中记录密码、密钥等敏感信息
- 定期清理日志文件
3. **监控异常**
- 设置日志监控告警
- 定期检查同步失败记录
## 总结
使用 Supervisor 守护进程管理订单同步任务的优势:
✅ **稳定可靠** - 自动重启,不会因为异常而停止
✅ **开机自启** - 服务器重启后自动恢复
✅ **日志完善** - 详细的执行日志,便于排查问题
✅ **易于管理** - 宝塔界面操作简单,SSH命令也很方便
✅ **双向同步** - 同时处理正向和反向同步,确保数据一致性
如有疑问,请参考:
- [订单同步定时任务说明.md](./订单同步定时任务说明.md)
- ThinkPHP 3.2.3 官方文档
- Supervisor 官方文档
---
**最后更新:** 2025-10-29

查看文件

@@ -0,0 +1,421 @@
# 宝塔面板 - 订单同步定时任务配置指南
## 方案选择
### ✅ 推荐:使用宝塔计划任务
订单同步任务是**定时执行**的任务,推荐使用**宝塔计划任务**功能。
### ⚠️ 不推荐:进程守护
进程守护适合需要**常驻运行**的服务(如消息队列消费者),不适合定时任务。
---
## 方案一:宝塔计划任务(推荐)
### 1. 登录宝塔面板
访问:`http://你的服务器IP:8888`
### 2. 进入计划任务
```
左侧菜单 → 计划任务
```
### 3. 添加计划任务
点击**"添加计划任务"**按钮,填写以下信息:
#### 基本配置
| 配置项 | 值 |
|--------|-----|
| **任务类型** | Shell脚本 |
| **任务名称** | 订单同步任务 |
| **执行周期** | N分钟(建议5分钟) |
| **脚本内容** | 见下方 |
#### 脚本内容
```bash
#!/bin/bash
cd /www/wwwroot/mss.nahaichuan.com
/www/server/php/74/bin/php index.php /Cli/OrderSync/syncRiderOrderStatus
```
**注意事项:**
1. 替换PHP版本路径(`/www/server/php/74/bin/php` 中的 `74` 改为你的PHP版本)
2. 确认项目路径(`/www/wwwroot/mss.nahaichuan.com`)
#### 查看PHP版本路径
在宝塔面板中查看:
```
软件商店 → 已安装 → PHP → 设置 → 配置文件 → 查看当前PHP路径
```
常见PHP路径:
- PHP 7.4: `/www/server/php/74/bin/php`
- PHP 7.3: `/www/server/php/73/bin/php`
- PHP 7.2: `/www/server/php/72/bin/php`
- PHP 8.0: `/www/server/php/80/bin/php`
- PHP 8.1: `/www/server/php/81/bin/php`
### 4. 设置执行周期
根据需求选择执行频率:
#### 每5分钟执行一次(推荐)
```
任务类型:N分钟
分钟数:5
```
#### 每分钟执行一次
```
任务类型:N分钟
分钟数:1
```
#### 每10分钟执行一次
```
任务类型:N分钟
分钟数:10
```
#### 自定义时间(使用Cron表达式)
```
任务类型:自定义
Cron表达式:*/5 * * * *
```
### 5. 日志配置
宝塔会自动记录执行日志。
**查看日志:**
```
计划任务 → 找到该任务 → 点击"日志"按钮
```
**日志路径:**
```
/www/server/cron/任务ID.log
```
### 6. 保存并启用
1. 点击**"确定"**保存任务
2. 确保任务状态为**"启用"**(绿色开关)
### 7. 手动测试
点击任务右侧的**"执行"**按钮,立即运行一次,查看是否正常。
---
## 方案二:进程守护(不推荐,仅供参考)
如果你确实需要使用进程守护,需要创建一个常驻脚本。
### 1. 创建守护脚本
创建文件:`/www/wwwroot/mss.nahaichuan.com/daemon_order_sync.php`
```php
<?php
/**
* 订单同步守护进程
* 每5分钟检查一次
*/
// 设置时区
date_default_timezone_set('Asia/Shanghai');
// 无限循环
while (true) {
echo "[" . date('Y-m-d H:i:s') . "] 开始执行订单同步...\n";
// 执行同步任务
$output = shell_exec('cd /www/wwwroot/mss.nahaichuan.com && /www/server/php/74/bin/php index.php /Cli/OrderSync/syncRiderOrderStatus 2>&1');
echo $output;
echo "[" . date('Y-m-d H:i:s') . "] 执行完成,等待下次执行...\n\n";
// 休眠5分钟(300秒)
sleep(300);
}
```
### 2. 配置进程守护
**路径:**
```
左侧菜单 → 软件商店 → 进程守护管理器 → 添加守护进程
```
**配置项:**
| 配置项 | 值 |
|--------|-----|
| **名称** | 订单同步守护 |
| **启动文件** | `/www/server/php/74/bin/php` |
| **启动参数** | `/www/wwwroot/mss.nahaichuan.com/daemon_order_sync.php` |
| **运行目录** | `/www/wwwroot/mss.nahaichuan.com` |
| **进程数量** | 1 |
### 3. 启动守护进程
1. 保存配置
2. 点击**"启动"**按钮
3. 查看**"运行状态"**是否为"运行中"
### 4. 查看日志
点击**"日志"**按钮查看运行日志。
### ⚠️ 进程守护的缺点
1. 占用系统资源(常驻进程)
2. 重启服务器需要手动启动
3. 进程崩溃需要监控
4. 不如计划任务灵活
---
## 配置示例截图说明
### 计划任务配置示例
```
┌─────────────────────────────────────────────┐
│ 添加计划任务 │
├─────────────────────────────────────────────┤
│ 任务类型: [Shell脚本 ▼] │
│ 任务名称: 订单同步任务 │
│ 执行周期: [N分钟 ▼] [5] 分钟 │
│ 脚本内容: │
│ ┌─────────────────────────────────────────┐ │
│ │#!/bin/bash │ │
│ │cd /www/wwwroot/mss.nahaichuan.com │ │
│ │/www/server/php/74/bin/php index.php \ │ │
│ │ /Cli/OrderSync/syncRiderOrderStatus │ │
│ └─────────────────────────────────────────┘ │
│ │
│ [取消] [确定] │
└─────────────────────────────────────────────┘
```
---
## 验证任务是否正常
### 1. 手动执行测试
在宝塔计划任务列表中,点击任务右侧的**"执行"**按钮。
### 2. 查看执行日志
点击**"日志"**按钮,应该看到类似输出:
```
===== 订单状态同步任务开始 =====
开始时间:2025-10-29 14:40:10
自动同步已启用,开始执行...
找到 4 个待同步的完成订单
✓ 订单 2625 状态已更新为完成
✓ 订单 2683 状态已更新为完成
✓ 订单 2701 状态已更新为完成
✓ 订单 2830 状态已更新为完成
完成状态同步:成功 4 个,失败 0 个
===== 同步任务完成 =====
总计:成功 4 个,失败 0 个
耗时:0.04 秒
结束时间:2025-10-29 14:40:10
```
### 3. 检查数据库
```sql
-- 查看最近的同步记录
SELECT * FROM ls_rider_order_sync_log
ORDER BY id DESC
LIMIT 10;
```
---
## 常见问题
### Q1: 找不到PHP路径怎么办?
**方法1:宝塔面板查看**
```
软件商店 → 已安装 → PHP → 设置 → 配置文件
```
**方法2:SSH命令查看**
```bash
which php
# 或
/www/server/php/*/bin/php -v
```
### Q2: 任务执行失败怎么办?
**检查步骤:**
1. 查看日志文件
```bash
cat /www/server/cron/任务ID.log
```
2. 手动执行测试
```bash
cd /www/wwwroot/mss.nahaichuan.com
/www/server/php/74/bin/php index.php /Cli/OrderSync/syncRiderOrderStatus
```
3. 检查权限
```bash
chmod +x /www/wwwroot/mss.nahaichuan.com/index.php
```
4. 检查PHP版本
```bash
/www/server/php/74/bin/php -v
```
### Q3: 如何修改执行频率?
在计划任务列表中:
1. 点击任务右侧的**"修改"**按钮
2. 修改**"执行周期"**
3. 点击**"确定"**保存
### Q4: 如何暂停任务?
点击任务右侧的开关按钮,变为灰色即为暂停。
### Q5: 如何删除任务?
点击任务右侧的**"删除"**按钮,确认删除。
---
## 高级配置
### 带日志输出的脚本
```bash
#!/bin/bash
# 定义日志目录
LOG_DIR="/www/wwwroot/mss.nahaichuan.com/Runtime/Logs/OrderSync"
LOG_FILE="${LOG_DIR}/$(date +%Y-%m-%d).log"
# 创建日志目录
mkdir -p ${LOG_DIR}
# 记录开始时间
echo "========================================" >> ${LOG_FILE}
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始执行订单同步任务" >> ${LOG_FILE}
# 执行任务
cd /www/wwwroot/mss.nahaichuan.com
/www/server/php/74/bin/php index.php /Cli/OrderSync/syncRiderOrderStatus >> ${LOG_FILE} 2>&1
# 记录结束
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 任务执行完成" >> ${LOG_FILE}
echo "" >> ${LOG_FILE}
```
### 错误通知脚本
```bash
#!/bin/bash
# 执行任务并捕获输出
cd /www/wwwroot/mss.nahaichuan.com
OUTPUT=$(/www/server/php/74/bin/php index.php /Cli/OrderSync/syncRiderOrderStatus 2>&1)
# 检查是否有错误
if echo "$OUTPUT" | grep -q "失败"; then
# 发送告警(可以对接钉钉、企业微信等)
echo "订单同步任务出现错误:" >> /tmp/order_sync_error.log
echo "$OUTPUT" >> /tmp/order_sync_error.log
fi
echo "$OUTPUT"
```
---
## 监控建议
### 1. 设置告警
在宝塔面板中:
```
计划任务 → 找到任务 → 点击"告警"
```
配置失败时的通知方式(短信、邮件、钉钉等)。
### 2. 定期检查
建议每周检查一次:
- 任务执行状态
- 执行日志
- 数据库同步记录
### 3. 性能监控
```sql
-- 查看今日同步统计
SELECT
DATE(sync_time) as date,
COUNT(*) as total,
SUM(CASE WHEN sync_result = 1 THEN 1 ELSE 0 END) as success,
SUM(CASE WHEN sync_result = 0 THEN 1 ELSE 0 END) as fail
FROM ls_rider_order_sync_log
WHERE sync_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY DATE(sync_time)
ORDER BY date DESC;
```
---
## 总结
### ✅ 推荐配置
- **使用方式**:宝塔计划任务
- **执行频率**:每5分钟
- **日志记录**:启用
- **告警通知**:启用
### 📝 配置清单
- [ ] 添加计划任务
- [ ] 设置正确的PHP路径
- [ ] 设置执行周期(5分钟)
- [ ] 手动测试执行
- [ ] 查看执行日志
- [ ] 验证数据库记录
- [ ] 启用告警通知
### 🔗 相关文档
- 详细使用说明:`docs/订单同步定时任务说明.md`
- 数据库表结构:`client/rider_tables.sql`
---
**配置完成后,订单同步任务将自动运行,无需人工干预!** 🎉

查看文件

@@ -0,0 +1,294 @@
# 订单同步定时任务使用说明
## 功能说明
该系统提供**双向同步**功能,确保原订单系统与骑手端数据实时同步:
### 1. 正向同步(batchSync)
将原始订单系统的待发货订单同步到骑手端,创建可接订单:
- **触发条件**:原订单状态为"待发货"(status = 1)
- **同步结果**:在骑手端创建"待接单"订单(order_status = 0)
- **作用**:让骑手能够看到新的配送任务
### 2. 反向同步(syncRiderOrderStatus)
将骑手操作的状态同步回原订单系统:
- **接单同步**:当骑手接单后(order_status = 1-5),自动将原始订单状态更新为"已发货"(status = 2)
- **完成同步**:当骑手配送完成后(order_status = 6),自动将原始订单状态更新为"已完成"(status = 3)
- **作用**:让商家系统实时了解配送进度
## 完整同步流程
```
┌─────────────────┐ 正向同步 ┌──────────────────┐
│ 原订单系统 │ ──────────────────────→ │ 骑手端系统 │
│ (待发货订单) │ batchSync │ (可接订单) │
│ │ │ │
│ status = 1 │ ←────────────────────── │ order_status │
│ ↓ │ 反向同步 │ 0 → 1 → ... → 6│
│ status = 2 │ syncRiderOrderStatus │ │
│ ↓ │ │ │
│ status = 3 │ │ │
└─────────────────┘ └──────────────────┘
步骤说明:
1. 商家创建订单(status = 1 待发货)
2. batchSync 将订单同步到骑手端(order_status = 0 待接单)
3. 骑手接单(order_status = 1)
4. syncRiderOrderStatus 更新原订单(status = 2 已发货)
5. 骑手配送完成(order_status = 6)
6. syncRiderOrderStatus 更新原订单(status = 3 已完成)
```
## 启用条件
定时任务执行前会检查 `ls_rider_config` 表中的 `auto_sync_enabled` 字段:
- 值为 `1`:启用自动同步,任务正常执行
- 值为 `0`:禁用自动同步,任务跳过
## 使用方式
### CLI命令行方式
适用于支持 PHP CLI 的服务器环境。
#### 1. 手动执行测试
```bash
# 进入项目根目录
cd /path/to/project
# 执行同步任务
php index.php Cli/OrderSync/syncRiderOrderStatus
# 执行批量同步(将原始订单同步为骑手订单)
php index.php Cli/OrderSync/batchSync
```
#### 2. 设置Cron定时任务
**重要:完整的订单同步需要同时运行两个任务**
编辑crontab:
```bash
crontab -e
```
添加以下配置:
```bash
# 方案一:每5分钟执行一次完整同步(推荐)
*/5 * * * * cd /path/to/project && php index.php Cli/OrderSync/batchSync >> /path/to/logs/batch_sync.log 2>&1
*/5 * * * * cd /path/to/project && php index.php Cli/OrderSync/syncRiderOrderStatus >> /path/to/logs/order_sync.log 2>&1
# 方案二:根据业务需求分别设置频率
# 正向同步(原订单→骑手端)- 每3分钟一次(新订单出现较快)
*/3 * * * * cd /path/to/project && php index.php Cli/OrderSync/batchSync >> /path/to/logs/batch_sync.log 2>&1
# 反向同步(骑手端→原订单)- 每1分钟一次(状态更新需要及时)
* * * * * cd /path/to/project && php index.php Cli/OrderSync/syncRiderOrderStatus >> /path/to/logs/order_sync.log 2>&1
```
## 输出结果示例
```
===== 订单状态同步任务开始 =====
开始时间:2024-01-20 10:00:00
自动同步已启用,开始执行...
找到 5 个待同步的接单订单
✓ 订单 1001 状态已更新为发货
✓ 订单 1002 状态已更新为发货
✓ 订单 1003 状态已更新为发货
✓ 订单 1004 状态已更新为发货
✓ 订单 1005 状态已更新为发货
接单状态同步:成功 5 个,失败 0 个
找到 3 个待同步的完成订单
✓ 订单 998 状态已更新为完成
✓ 订单 999 状态已更新为完成
✓ 订单 1000 状态已更新为完成
完成状态同步:成功 3 个,失败 0 个
===== 同步任务完成 =====
总计:成功 8 个,失败 0 个
耗时:0.52 秒
结束时间:2024-01-20 10:00:01
```
## 日志记录
### 1. 运行日志
日志位置:`Runtime/Logs/OrderSync/YYYY-MM-DD.log`
日志内容:
```
[2024-01-20 10:00:00] 同步任务完成,成功 8 个,失败 0 个
[2024-01-20 10:05:00] 自动同步未启用,任务终止
[2024-01-20 10:10:00] 同步任务异常:数据库连接失败
```
### 2. 数据库同步日志
所有同步操作都会记录到 `ls_rider_order_sync_log` 表中,包括:
- 原订单ID(bill_id)
- 骑手订单ID(rider_order_id)
- 骑手ID(rider_id)
- 操作类型(operation_type):`accept`(接单)、`complete`(完成)
- 原状态(old_status)
- 新状态(new_status)
- 同步结果(sync_result):1成功,0失败
- 错误信息(error_msg)
- 同步时间(sync_time)
## 状态映射关系
### 骑手订单状态(ls_rider_order.order_status)
| 状态值 | 状态说明 | 同步到原订单 |
|--------|----------|-------------|
| 0 | 待接单 | 不同步 |
| 1 | 已接单 | 发货(status=2) |
| 2 | 前往商家 | 发货(status=2) |
| 3 | 已到店 | 发货(status=2) |
| 4 | 已取餐 | 发货(status=2) |
| 5 | 配送中 | 发货(status=2) |
| 6 | 已送达 | 完成(status=3) |
| 7 | 异常 | 不同步 |
| 8 | 已取消 | 不同步 |
### 原订单状态(ls_retail_bill_online.status)
| 状态值 | 状态说明 |
|--------|----------|
| 1 | 未发货 |
| 2 | 已发货 |
| 3 | 已完成 |
## 注意事项
1. **执行频率建议**
- 推荐每1-5分钟执行一次
- 不建议设置太频繁(如每秒),避免数据库压力
2. **性能优化**
- 任务设置了5分钟超时限制
- 大量订单时可能需要调整 `set_time_limit()`
- 建议在数据库相关字段添加索引
3. **监控建议**
- 定期检查日志文件,确保任务正常执行
- 监控 `ls_rider_order_sync_log` 表的 `sync_result` 字段
- 设置异常告警机制
4. **测试流程**
- 在生产环境启用前,先在测试环境验证
- 确认数据库表结构完整
- 手动执行测试,检查返回结果和日志
## 启用步骤
### 1. 数据库配置
确保 `ls_rider_config` 表有配置记录:
```sql
-- 查看当前配置
SELECT * FROM ls_rider_config WHERE merchant_id = 0;
-- 如果没有记录,插入默认配置
INSERT INTO ls_rider_config (
merchant_id,
auto_sync_enabled,
created_time,
updated_time
) VALUES (
0,
1,
UNIX_TIMESTAMP(),
UNIX_TIMESTAMP()
);
-- 启用自动同步
UPDATE ls_rider_config SET auto_sync_enabled = 1 WHERE merchant_id = 0;
-- 禁用自动同步
UPDATE ls_rider_config SET auto_sync_enabled = 0 WHERE merchant_id = 0;
```
### 2. 权限检查
确保定时任务有权限访问:
- 读取数据库
- 写入日志目录
- 执行PHP脚本
### 3. 测试执行
```bash
# 测试同步任务
php index.php Cli/OrderSync/syncRiderOrderStatus
# 测试批量同步
php index.php Cli/OrderSync/batchSync
```
### 4. 设置定时任务
根据执行频率设置Cron定时任务。
### 5. 监控运行
```bash
# 查看运行日志
tail -f Runtime/Logs/OrderSync/$(date +%Y-%m-%d).log
# 查看同步记录
mysql> SELECT * FROM ls_rider_order_sync_log ORDER BY add_time DESC LIMIT 10;
```
## 故障排查
### 问题:任务不执行
**检查项:**
1. Cron是否正确设置并运行
2. PHP路径是否正确
3. 项目路径是否正确
4. 文件权限是否正确
```bash
# 检查Cron是否运行
service cron status
# 手动执行测试
php index.php /Cli/OrderSync/syncRiderOrderStatus
# 查看Cron日志
tail -f /var/log/cron
```
### 问题:同步失败
**检查项:**
1. 数据库连接是否正常
2. `auto_sync_enabled` 是否为 1
3. 表结构是否完整
4. 查看错误日志
```bash
# 查看运行日志
cat Runtime/Logs/OrderSync/$(date +%Y-%m-%d).log
# 查看同步失败记录
mysql> SELECT * FROM ls_rider_order_sync_log WHERE sync_result = 0 ORDER BY add_time DESC LIMIT 10;
```
## 技术支持
如有问题,请联系技术支持团队或查看以下资源:
- 项目文档
- 数据库表结构文件:`client/rider_tables.sql`
- 源代码注释

查看文件

@@ -0,0 +1,299 @@
# 订单同步定时任务 - 快速开始
## 📋 功能说明
自动同步骑手订单状态到原始订单系统:
- ✅ 骑手接单后 → 原订单状态更新为"已发货"
- ✅ 骑手配送完成 → 原订单状态更新为"已完成"
## 🚀 快速开始(5分钟)
### 步骤1:初始化数据库配置
```bash
# 登录MySQL
mysql -u用户名 -p
# 选择数据库
use 数据库名;
# 执行初始化脚本
source docs/init_auto_sync.sql;
```
或者手动执行:
```sql
-- 启用自动同步
UPDATE ls_rider_config SET auto_sync_enabled = 1 WHERE merchant_id = 0;
```
### 步骤2:测试运行
**Linux/Mac:**
```bash
# 赋予执行权限
chmod +x scripts/test_order_sync.sh
# 编辑脚本,修改项目路径
vim scripts/test_order_sync.sh
# 修改:PROJECT_ROOT="/path/to/your/project"
# 运行测试
./scripts/test_order_sync.sh
# 选择选项 1:测试CLI模式 - 同步订单状态
```
**Windows:**
```batch
# 编辑脚本,修改项目路径
记事本打开 scripts\test_order_sync.bat
修改:set PROJECT_ROOT=D:\Project\mss.nahaichuan.com
# 运行测试
scripts\test_order_sync.bat
选择选项 1:测试CLI模式 - 同步订单状态
```
**直接命令行:**
```bash
cd /path/to/project
php index.php /Cli/OrderSync/syncRiderOrderStatus
```
### 步骤3:设置定时任务
**Linux Cron:**
```bash
# 编辑crontab
crontab -e
# 添加以下行(每5分钟执行一次)
*/5 * * * * cd /path/to/project && php index.php /Cli/OrderSync/syncRiderOrderStatus >> /var/log/order_sync.log 2>&1
```
**Windows 计划任务:**
1. 打开"任务计划程序"(运行:`taskschd.msc`)
2. 创建基本任务
3. 触发器:每5分钟
4. 操作:启动程序
- 程序:`C:\php\php.exe`(你的PHP路径)
- 参数:`index.php /Cli/OrderSync/syncRiderOrderStatus`
- 起始于:`D:\Project\mss.nahaichuan.com`(你的项目路径)
**Web Cron(虚拟主机):**
```bash
# 1. 设置密钥
编辑:Application/Cron/Controller/OrderSyncController.class.php
修改:const SECRET_KEY = 'your_secure_random_key';
# 2. 添加Cron
*/5 * * * * curl -s "http://your-domain.com/Cron/OrderSync/syncRiderOrderStatus?key=your_key" >> /var/log/order_sync.log 2>&1
```
### 步骤4:验证运行
**查看日志:**
```bash
# Linux/Mac
tail -f Runtime/Logs/OrderSync/$(date +%Y-%m-%d).log
# Windows
type Runtime\Logs\OrderSync\2024-01-20.log
```
**查看数据库同步记录:**
```sql
SELECT * FROM ls_rider_order_sync_log ORDER BY id DESC LIMIT 10;
```
## 📊 状态映射
| 骑手订单状态 | 状态值 | 同步到原订单 |
|-------------|--------|-------------|
| 待接单 | 0 | 不同步 |
| 已接单 | 1 | → 已发货(2) |
| 前往商家 | 2 | → 已发货(2) |
| 已到店 | 3 | → 已发货(2) |
| 已取餐 | 4 | → 已发货(2) |
| 配送中 | 5 | → 已发货(2) |
| **已送达** | **6** | **→ 已完成(3)** |
| 异常 | 7 | 不同步 |
| 已取消 | 8 | 不同步 |
## 🔧 常用命令
### 手动同步
```bash
# 同步订单状态
php index.php /Cli/OrderSync/syncRiderOrderStatus
# 批量同步订单(创建骑手订单)
php index.php /Cli/OrderSync/batchSync
```
### 查看日志
```bash
# 今日日志
cat Runtime/Logs/OrderSync/$(date +%Y-%m-%d).log
# 实时监控
tail -f Runtime/Logs/OrderSync/$(date +%Y-%m-%d).log
# 统计成功数
grep "同步任务完成" Runtime/Logs/OrderSync/*.log
```
### 数据库查询
```sql
-- 查看配置状态
SELECT * FROM ls_rider_config WHERE merchant_id = 0;
-- 查看待同步订单
SELECT COUNT(*) FROM ls_rider_order ro
LEFT JOIN ls_retail_bill_online o ON ro.bill_id = o.bill_id
WHERE ro.order_status IN (1,2,3,4,5) AND o.status = 1;
-- 查看同步记录
SELECT * FROM ls_rider_order_sync_log
WHERE DATE(sync_time) = CURDATE()
ORDER BY id DESC;
-- 统计今日同步情况
SELECT
operation_type,
COUNT(*) as total,
SUM(CASE WHEN sync_result = 1 THEN 1 ELSE 0 END) as success,
SUM(CASE WHEN sync_result = 0 THEN 1 ELSE 0 END) as fail
FROM ls_rider_order_sync_log
WHERE DATE(sync_time) = CURDATE()
GROUP BY operation_type;
```
### 启用/禁用同步
```sql
-- 启用
UPDATE ls_rider_config SET auto_sync_enabled = 1 WHERE merchant_id = 0;
-- 禁用
UPDATE ls_rider_config SET auto_sync_enabled = 0 WHERE merchant_id = 0;
-- 验证
SELECT auto_sync_enabled FROM ls_rider_config WHERE merchant_id = 0;
```
## ⚠️ 注意事项
1. **执行频率**
- 推荐:每1-5分钟
- 不推荐:每秒(数据库压力大)
2. **安全性**
- Web方式必须设置安全密钥
- 密钥至少32位随机字符
- 不要将密钥提交到Git
3. **监控**
- 定期检查日志
- 监控同步失败记录
- 设置异常告警
4. **测试**
- 生产环境前先测试
- 确认数据库表完整
- 验证同步逻辑正确
## 🐛 故障排查
### 任务不执行?
**检查:**
```bash
# 1. Cron是否运行
service cron status # Linux
# 或 检查Windows计划任务
# 2. PHP路径是否正确
which php
php -v
# 3. 项目路径是否正确
cd /path/to/project && pwd
# 4. 手动执行测试
php index.php /Cli/OrderSync/syncRiderOrderStatus
```
### 同步失败?
**检查:**
```bash
# 1. 查看错误日志
tail -100 Runtime/Logs/OrderSync/$(date +%Y-%m-%d).log
# 2. 查看数据库失败记录
mysql> SELECT * FROM ls_rider_order_sync_log
WHERE sync_result = 0
ORDER BY id DESC LIMIT 10;
# 3. 检查配置
mysql> SELECT * FROM ls_rider_config WHERE merchant_id = 0;
# 4. 检查表结构
mysql> SHOW TABLES LIKE 'ls_rider%';
```
### Web方式报错?
**检查:**
1. 密钥是否正确
2. URL参数是否完整
3. 服务器是否可访问
4. PHP错误日志
```bash
# 测试连通性
curl -v "http://your-domain.com/Cron/OrderSync/health?key=your_key"
# 查看PHP错误日志
tail -f /var/log/php_errors.log
```
## 📚 相关文档
- 详细说明:`docs/订单同步定时任务说明.md`
- 数据库表结构:`client/rider_tables.sql`
- 初始化脚本:`docs/init_auto_sync.sql`
- 测试工具:`scripts/test_order_sync.sh` / `scripts/test_order_sync.bat`
## 💡 常见问题
**Q: 可以同时运行多个定时任务吗?**
A: 可以,但不建议。建议使用文件锁防止并发执行。
**Q: 如何只同步特定门店的订单?**
A: 修改代码中的 WHERE 条件,添加 store_id 筛选。
**Q: 同步失败了怎么办?**
A: 查看 ls_rider_order_sync_log 表的 error_msg 字段,根据错误信息处理。
**Q: 可以手动重新同步吗?**
A: 可以,删除对应的同步日志记录后重新执行任务。
**Q: 如何暂停同步?**
A: 执行 SQL:`UPDATE ls_rider_config SET auto_sync_enabled = 0 WHERE merchant_id = 0;`
## 🎯 下一步
1. ✅ 初始化数据库配置
2. ✅ 测试手动执行
3. ✅ 设置定时任务
4. ✅ 监控运行日志
5. ⏭️ 优化配置参数
6. ⏭️ 设置异常告警
7. ⏭️ 定期维护检查
---
**需要帮助?** 查看详细文档或联系技术支持。