畅捷通定时任务配置与Cron自动化运维指南
概述
畅捷通集成系统采用"CLI脚本 + Cron定时 + Web手动触发"的混合运维模式。sync_all.php 支持一键全量同步,各独立脚本支持单独执行,resend_appTicket.php 提供 Ticket 手动补推能力。本文详解部署环境配置、定时策略设计、日志监控和异常恢复方案。

一、服务端部署架构
1.1 目录结构
/var/www/chanjet/ # 部署根目录
├── config.json # 凭证和数据库配置
├── appTicket.php # Ticket接收端点
├── fetch_token.php # Token获取脚本
├── resend_appTicket.php # Ticket补推工具
├── get_token.php # Web Token管理器
├── sync_all.php # 一键全量同步
├── sync_helper.php # 通用函数库
├── sync_warehouse.php # 仓库同步
├── sync_employee.php # 员工同步
├── sync_partner.php # 往来单位同步
├── sync_inventory.php # 存货同步
├── sync_inventory_class.php # 存货分类同步
├── sync_bom.php # BOM同步
├── db_view.php # 数据查看工具
├── test_purchase.php # 采购订单测试
├── HaoTong.php # 审批流插件
├── connector/ # 低代码编排平台
└── appTicket.txt # Ticket文件(运行时生成)
1.2 Nginx 配置要点
server {
listen 20080;
server_name _;
root /var/www/chanjet;
location /chanjet/ {
# 关键:appTicket.php 必须能接收外部POST请求
}
location /chanjet/appTicket.php {
# 畅捷通平台回调地址,需公网可达
}
}

二、Cron 定时任务配置
2.1 推荐 Cron 配置
# 编辑 crontab
crontab -e
# ============================================
# 畅捷通 T+ 数据同步定时任务
# ============================================
# 1. 每日凌晨2点 — 全量同步所有基础档案
0 2 * * * /usr/bin/curl -s http://127.0.0.1:20080/chanjet/sync_all.php >> /var/log/chanjet/sync_$(date +\%Y\%m\%d).log 2>&1
# 2. 每5天凌晨3点 — 刷新Token(6天有效期,留1天buffer)
0 3 */5 * * /usr/bin/php /var/www/chanjet/fetch_token.php >> /var/log/chanjet/token_$(date +\%Y\%m\%d).log 2>&1
# 3. 每周一凌晨4点 — 补推appTicket
0 4 * * 1 /usr/bin/php /var/www/chanjet/resend_appTicket.php >> /var/log/chanjet/ticket_$(date +\%Y\%m\%d).log 2>&1
# 4. 每6小时 — 存货增量同步(可选,数据变化频繁时启用)
# 0 */6 * * * /usr/bin/curl -s http://127.0.0.1:20080/chanjet/sync_inventory.php >> /var/log/chanjet/inventory_$(date +\%Y\%m\%d).log 2>&1
2.2 Cron 时间策略分析
| 任务 | Cron表达式 | 频率 | 原因 |
|---|---|---|---|
| 全量同步 | 0 2 * * * |
每天 | 凌晨业务低峰期 |
| Token刷新 | 0 3 */5 * * |
每5天 | Token有效期6天 |
| Ticket补推 | 0 4 * * 1 |
每周 | Ticket 30分钟有效但仅需确保通路 |
| 日志清理 | 0 5 * * 0 |
每周 | 清理30天前日志 |

三、sync_all.php 执行策略
3.1 顺序执行机制
// sync_all.php 第19-59行
// 严格按顺序执行,先轻后重
try { $results['warehouse'] = syncWarehouse(); } // ① 仓库(18条)
catch (Exception $e) { /* 失败不中断 */ }
try { $results['employee'] = syncEmployee(); } // ② 员工(48条)
catch (Exception $e) { /* 失败不中断 */ }
try { $results['partner'] = syncPartner(); } // ③ 往来单位(100条)
catch (Exception $e) { /* 失败不中断 */ }
try { $results['inventory'] = syncInventory(); } // ④ 存货(7989条)
catch (Exception $e) { /* 失败不中断 */ }
try { $results['inventory_class'] = syncInventoryClass(); } // ⑤ 分类(671条)
catch (Exception $e) { /* 失败不中断 */ }
try { $results['bom'] = syncBom(); } // ⑥ BOM(95条)
catch (Exception $e) { /* 失败不中断 */ }
设计哲学:每个模块独立 try/catch,一个失败不影响其他。汇总返回各模块的成功/失败状态。
3.2 执行反馈格式
成功响应:
{
"success": true,
"time": "2025-06-18 02:00:15",
"total": 8921,
"results": {
"warehouse": {"success": true, "count": 18},
"employee": {"success": true, "count": 48},
"partner": {"success": true, "count": 100},
"inventory": {"success": true, "count": 7989},
"inventory_class": {"success": true, "count": 671},
"bom": {"success": true, "count": 95}
}
}
部分失败:
{
"success": false,
"time": "2025-06-18 02:05:30",
"total": 8020,
"results": {
"warehouse": {"success": true, "count": 18},
"employee": {"success": true, "count": 48},
"partner": {"success": true, "count": 100},
"inventory": {"success": false, "message": "cURL error: timeout", "count": 0},
"inventory_class": {"success": true, "count": 671},
"bom": {"success": true, "count": 95}
}
}
四、手动运维操作
4.1 快速数据校验
# 查看所有表的数据统计
curl http://127.0.0.1:20080/chanjet/db_view.php
# 查看存货表前50条
curl "http://127.0.0.1:20080/chanjet/db_view.php?t=tplus_inventory"
# 查看BOM表第3页
curl "http://127.0.0.1:20080/chanjet/db_view.php?t=tplus_bom&p=3"
4.2 Token 手动刷新
# 当Token过期时手动刷新
php /var/www/chanjet/fetch_token.php
# 或通过Web界面
# 浏览器访问: http://127.0.0.1:20080/chanjet/get_token.php
4.3 appTicket 补推
# appTicket接收异常时手动触发
php /var/www/chanjet/resend_appTicket.php
# 或浏览器访问Web界面
# http://127.0.0.1:20080/chanjet/resend_appTicket.php
4.4 单个模块重新同步
# 仅同步存货(大表,独立执行更快)
curl http://127.0.0.1:20080/chanjet/sync_inventory.php
# 仅同步BOM
curl http://127.0.0.1:20080/chanjet/sync_bom.php
五、日志管理
5.1 日志路径规划
/var/log/chanjet/
├── sync_20250618.log # 每日同步日志
├── token_20250618.log # Token刷新日志
├── ticket_20250618.log # Ticket推送日志
└── archive/ # 历史归档
5.2 日志清理 Cron
# 每周日清理30天前的日志
0 5 * * 0 find /var/log/chanjet/ -name "*.log" -mtime +30 -delete
5.3 异常检测脚本
#!/bin/bash
# check_sync.sh - 检测同步是否成功
LOG_FILE="/var/log/chanjet/sync_$(date +%Y%m%d).log"
if ! grep -q '"success":true' "$LOG_FILE"; then
echo "⚠ 畅捷通同步失败!" | mail -s "同步告警" admin@example.com
fi
六、故障恢复流程

七、监控告警配置建议
# 钉钉/企业微信 Webhook 告警(示例)
# 在 sync_all.php 执行后调用
WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx"
if [ "$SYNC_SUCCESS" != "true" ]; then
curl -H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"⚠ 畅捷通同步失败!时间:$(date)\"}}" \
"$WEBHOOK_URL"
fi
八、运维检查清单
| 频率 | 检查项 | 方法 |
|---|---|---|
| 每日 | 同步日志中"success":true |
grep success /var/log/chanjet/sync_*.log |
| 每日 | 各表数据量是否在合理范围 | db_view.php 首页查看 |
| 每周 | Token 是否在有效期内 | get_token.php Web界面查看 |
| 每周 | appTicket 接收端点是否可达 | curl -I appTicket.php |
| 每月 | 日志文件磁盘占用 | du -sh /var/log/chanjet/ |
浙公网安备 33010602011771号