微信营销管理系统 - 益童宝销售管理平台
- 数据库: PostgreSQL schema + 3名销售/21客户/341消息/6成交 - 采集代理: mock_sync.py 模拟微信聊天同步 - AI分析: analyze.py 规则模式 + 千问LLM模式 - 后端: FastAPI 11个API接口 - 前端: 仪表盘/销售列表/客户列表/成交记录/交流分析/录入成交 - 交流分析: 全部客户对话概览 + LLM标准范式对话生成 - 部署: systemd + nginx, 已部署至 sale.all8ai.top
This commit is contained in:
Executable
+132
@@ -0,0 +1,132 @@
|
||||
#!/bin/bash
|
||||
set -eu
|
||||
|
||||
# ============================================
|
||||
# 微信营销管理系统 MVP - 一键启动
|
||||
# ============================================
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")" && pwd)"
|
||||
BIN="/usr/local/opt/postgresql@17/bin"
|
||||
PID_FILE="$ROOT/.run.pid"
|
||||
|
||||
cd "$ROOT"
|
||||
|
||||
echo "=========================================="
|
||||
echo " 微信营销管理系统 MVP 启动"
|
||||
echo "=========================================="
|
||||
|
||||
# 1. 检查 PostgreSQL 17
|
||||
if [ ! -x "$BIN/pg_ctl" ]; then
|
||||
echo "[ERROR] 未找到 PostgreSQL 17: $BIN/pg_ctl"
|
||||
echo "请安装: brew install postgresql@17"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. 初始化并启动数据库
|
||||
echo "[1/5] 初始化数据库..."
|
||||
bash "$ROOT/db/init_db.sh"
|
||||
|
||||
# 3. 运行模拟采集代理
|
||||
echo ""
|
||||
echo "[2/5] 运行模拟采集代理..."
|
||||
for sp_id in 1 2 3; do
|
||||
python "$ROOT/agent/mock_sync.py" --salesperson-id $sp_id
|
||||
done
|
||||
|
||||
# 4. AI 分析
|
||||
echo ""
|
||||
echo "[3/5] AI 分析..."
|
||||
if [ -n "$DASHSCOPE_API_KEY" ]; then
|
||||
echo " 使用千问 LLM 模式"
|
||||
python "$ROOT/ai/analyze.py" --mode llm
|
||||
else
|
||||
echo " 未设置 DASHSCOPE_API_KEY,使用规则模式"
|
||||
python "$ROOT/ai/analyze.py" --mode rule
|
||||
fi
|
||||
|
||||
# 5. 预置成交数据
|
||||
echo ""
|
||||
echo "[4/5] 预置成交数据..."
|
||||
PSQL="$BIN/psql -h $ROOT/db/socket -p 5434 -d wxchat_sales"
|
||||
$PSQL -c "
|
||||
-- 清理测试数据和重复数据
|
||||
DELETE FROM deal WHERE product_name = '测试产品';
|
||||
DELETE FROM deal d1 USING deal d2
|
||||
WHERE d1.id > d2.id
|
||||
AND d1.customer_id = d2.customer_id
|
||||
AND d1.product_name = d2.product_name
|
||||
AND d1.deal_date = d2.deal_date;
|
||||
|
||||
-- 预置成交(用 NOT EXISTS 防重复)
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, '益童宝3盒套餐', 798, '2026-07-05', 'closed'
|
||||
FROM salesperson s, customer cu
|
||||
WHERE s.id = 1 AND cu.salesperson_id = 1 AND cu.customer_name LIKE '辰辰%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '益童宝3盒套餐' AND deal_date = '2026-07-05');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, '益童宝3盒套餐', 798, '2026-07-08', 'closed'
|
||||
FROM salesperson s, customer cu
|
||||
WHERE s.id = 1 AND cu.salesperson_id = 1 AND cu.customer_name LIKE '依依%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '益童宝3盒套餐' AND deal_date = '2026-07-08');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, '益童宝6盒套餐', 1499, '2026-07-12', 'closed'
|
||||
FROM salesperson s, customer cu
|
||||
WHERE s.id = 1 AND cu.salesperson_id = 1 AND cu.customer_name LIKE '糖糖%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '益童宝6盒套餐' AND deal_date = '2026-07-12');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, '益童宝单盒', 298, '2026-07-10', 'closed'
|
||||
FROM salesperson s, customer cu
|
||||
WHERE s.id = 2 AND cu.salesperson_id = 2 AND cu.customer_name LIKE '甜甜%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '益童宝单盒' AND deal_date = '2026-07-10');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, '益童宝3盒套餐', 798, '2026-07-06', 'closed'
|
||||
FROM salesperson s, customer cu
|
||||
WHERE s.id = 3 AND cu.salesperson_id = 3 AND cu.customer_name LIKE '阳阳%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '益童宝3盒套餐' AND deal_date = '2026-07-06');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, '益童宝3盒套餐', 798, '2026-06-20', 'closed'
|
||||
FROM salesperson s, customer cu
|
||||
WHERE s.id = 3 AND cu.salesperson_id = 3 AND cu.customer_name LIKE '糖糖%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '益童宝3盒套餐' AND deal_date = '2026-06-20');
|
||||
" 2>/dev/null || true
|
||||
|
||||
DEAL_COUNT=$($PSQL -t -c "SELECT count(*) FROM deal")
|
||||
echo " 成交记录: $DEAL_COUNT 条"
|
||||
|
||||
# 6. 启动 Web 服务
|
||||
echo ""
|
||||
echo "[5/5] 启动 Web 服务..."
|
||||
# 检查端口是否被占用
|
||||
if lsof -ti:8770 >/dev/null 2>&1; then
|
||||
echo " 端口 8770 已被占用,先停止..."
|
||||
kill $(lsof -ti:8770) 2>/dev/null || true
|
||||
sleep 1
|
||||
fi
|
||||
|
||||
nohup python -m uvicorn web.server:app --port 8770 --host 127.0.0.1 \
|
||||
> "$ROOT/web.log" 2>&1 &
|
||||
echo $! > "$PID_FILE"
|
||||
sleep 2
|
||||
|
||||
# 验证
|
||||
if curl -s http://127.0.0.1:8770/api/dashboard >/dev/null 2>&1; then
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " ✓ 系统启动成功!"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo " Web 界面: http://127.0.0.1:8770"
|
||||
echo " API 文档: http://127.0.0.1:8770/docs"
|
||||
echo ""
|
||||
echo " 停止系统: bash stop_demo.sh"
|
||||
echo "=========================================="
|
||||
else
|
||||
echo "[ERROR] Web 服务启动失败,请查看 web.log"
|
||||
cat "$ROOT/web.log"
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user