#!/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 python3 "$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 模式" python3 "$ROOT/ai/analyze.py" --mode llm else echo " 未设置 DASHSCOPE_API_KEY,使用规则模式" python3 "$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; -- 清理旧格式产品名数据(不带产品线前缀的旧名称) DELETE FROM deal WHERE product_name IN ('益童宝3盒套餐', '益童宝6盒套餐', '益童宝单盒'); -- 预置成交(用 NOT EXISTS 防重复) INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status) SELECT s.id, cu.id, 1, '益童宝益生菌 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_id, product_name, amount, deal_date, status) SELECT s.id, cu.id, 1, '益童宝益生菌 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_id, product_name, amount, deal_date, status) SELECT s.id, cu.id, 3, '益童宝益生菌 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_id, product_name, amount, deal_date, status) SELECT s.id, cu.id, 2, '益童宝益生菌 单盒', 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_id, product_name, amount, deal_date, status) SELECT s.id, cu.id, 1, '益童宝益生菌 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_id, product_name, amount, deal_date, status) SELECT s.id, cu.id, 1, '益童宝益生菌 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'); -- 减肥益生菌预置成交 INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status) SELECT s.id, cu.id, 4, '纤益益生菌 2盒套餐', 656, '2026-07-08', '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 = '纤益益生菌 2盒套餐' AND deal_date = '2026-07-08'); INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status) SELECT s.id, cu.id, 4, '纤益益生菌 2盒套餐', 656, '2026-07-14', '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 = '纤益益生菌 2盒套餐' AND deal_date = '2026-07-14'); INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status) SELECT s.id, cu.id, 5, '纤益益生菌 单盒', 328, '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_id, product_name, amount, deal_date, status) SELECT s.id, cu.id, 4, '纤益益生菌 2盒套餐', 656, '2026-07-13', '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 = '纤益益生菌 2盒套餐' AND deal_date = '2026-07-13'); " 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 python3 -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