微信营销管理系统 - 益童宝销售管理平台
- 数据库: 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:
@@ -0,0 +1,52 @@
|
||||
-- 数据库层测试脚本
|
||||
-- 用法: psql -h demo/db/socket -p 5434 -d wxchat_sales -f test_db.sql
|
||||
|
||||
-- 测试1: 验证 6 张表存在
|
||||
\echo '=== TEST 1: 表存在性检查 ==='
|
||||
SELECT tablename FROM pg_tables WHERE schemaname='public' ORDER BY tablename;
|
||||
-- 预期: contact, conversation, customer, deal, message, salesperson
|
||||
|
||||
-- 测试2: 验证 3 名预置销售
|
||||
\echo '=== TEST 2: 销售人员数据 ==='
|
||||
SELECT id, name, team, wx_account FROM salesperson ORDER BY id;
|
||||
-- 预期: 3 行
|
||||
|
||||
-- 测试3: 验证唯一约束(插入重复销售应跳过)
|
||||
\echo '=== TEST 3: 幂等插入 ==='
|
||||
INSERT INTO salesperson (id, name, team, wx_account, device_id) VALUES
|
||||
(1, '张伟', '华东团队', 'wxid_zhangwei', 'macbook-zw-001')
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
SELECT count(*) AS salesperson_count FROM salesperson;
|
||||
-- 预期: 3
|
||||
|
||||
-- 测试4: 验证 contact 唯一约束
|
||||
\echo '=== TEST 4: contact 唯一约束 ==='
|
||||
INSERT INTO contact (salesperson_id, wx_username, display_name) VALUES (1, 'test_dup', '测试');
|
||||
-- 第二次插入应失败
|
||||
DO $$
|
||||
BEGIN
|
||||
INSERT INTO contact (salesperson_id, wx_username, display_name) VALUES (1, 'test_dup', '测试2');
|
||||
RAISE EXCEPTION '唯一约束未生效';
|
||||
EXCEPTION
|
||||
WHEN unique_violation THEN
|
||||
RAISE NOTICE '唯一约束生效: OK';
|
||||
END $$;
|
||||
-- 清理
|
||||
DELETE FROM contact WHERE wx_username = 'test_dup';
|
||||
|
||||
-- 测试5: 验证外键约束
|
||||
\echo '=== TEST 5: 外键约束 ==='
|
||||
DO $$
|
||||
BEGIN
|
||||
INSERT INTO contact (salesperson_id, wx_username, display_name) VALUES (999, 'test_fk', '测试');
|
||||
RAISE EXCEPTION '外键约束未生效';
|
||||
EXCEPTION
|
||||
WHEN foreign_key_violation THEN
|
||||
RAISE NOTICE '外键约束生效: OK';
|
||||
END $$;
|
||||
|
||||
-- 测试6: 验证索引存在
|
||||
\echo '=== TEST 6: 索引检查 ==='
|
||||
SELECT indexname FROM pg_indexes WHERE schemaname='public' ORDER BY indexname;
|
||||
|
||||
\echo '=== ALL TESTS DONE ==='
|
||||
Executable
+82
@@ -0,0 +1,82 @@
|
||||
#!/bin/bash
|
||||
set -eu
|
||||
|
||||
# ============================================
|
||||
# 端到端测试
|
||||
# ============================================
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
API="http://127.0.0.1:8770/api"
|
||||
PASS=0
|
||||
FAIL=0
|
||||
|
||||
check() {
|
||||
local name="$1"
|
||||
local condition="$2"
|
||||
if eval "$condition"; then
|
||||
echo " ✓ $name"
|
||||
PASS=$((PASS + 1))
|
||||
else
|
||||
echo " ✗ $name"
|
||||
FAIL=$((FAIL + 1))
|
||||
fi
|
||||
}
|
||||
|
||||
echo "=== 端到端测试 ==="
|
||||
echo ""
|
||||
|
||||
# 测试1: 仪表盘
|
||||
echo "[仪表盘]"
|
||||
DASHBOARD=$(curl -s "$API/dashboard")
|
||||
check "仪表盘返回200" '[ -n "$DASHBOARD" ]'
|
||||
check "总消息数 > 0" 'echo "$DASHBOARD" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if d[\"total_messages\"]>0 else 1)"'
|
||||
check "销售人数 = 3" 'echo "$DASHBOARD" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d[\"salespersons\"])==3 else 1)"'
|
||||
|
||||
# 测试2: 销售列表
|
||||
echo "[销售列表]"
|
||||
SP=$(curl -s "$API/salespersons")
|
||||
check "销售列表返回3条" 'echo "$SP" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d)==3 else 1)"'
|
||||
|
||||
# 测试3: 客户列表
|
||||
echo "[客户列表]"
|
||||
CUSTOMERS=$(curl -s "$API/customers")
|
||||
check "客户列表非空" 'echo "$CUSTOMERS" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d)>0 else 1)"'
|
||||
|
||||
HIGH=$(curl -s "$API/customers?intent_level=high")
|
||||
check "高意向筛选有效" 'echo "$HIGH" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if all(c[\"intent_level\"]==\"high\" for c in d) else 1)"'
|
||||
|
||||
# 测试4: 客户详情
|
||||
echo "[客户详情]"
|
||||
FIRST_CUST_ID=$(echo "$CUSTOMERS" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d[0][\"id\"])")
|
||||
DETAIL=$(curl -s "$API/customers/$FIRST_CUST_ID")
|
||||
check "客户详情有摘要" 'echo "$DETAIL" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if d.get(\"summary\") else 1)"'
|
||||
check "客户详情有阶段" 'echo "$DETAIL" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if d.get(\"stage\") else 1)"'
|
||||
|
||||
# 测试5: 聊天记录
|
||||
echo "[聊天记录]"
|
||||
MSGS=$(curl -s "$API/customers/$FIRST_CUST_ID/messages?page=1&page_size=10")
|
||||
check "聊天记录非空" 'echo "$MSGS" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d[\"messages\"])>0 else 1)"'
|
||||
check "聊天记录总数 > 0" 'echo "$MSGS" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if d[\"total\"]>0 else 1)"'
|
||||
|
||||
# 测试6: 成交录入
|
||||
echo "[成交录入]"
|
||||
DEAL_RES=$(curl -s -X POST "$API/deals" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"salesperson_id\":1,\"customer_id\":$FIRST_CUST_ID,\"product_name\":\"测试产品\",\"amount\":99,\"deal_date\":\"2026-07-14\"}")
|
||||
check "成交录入成功" 'echo "$DEAL_RES" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if d.get(\"id\") else 1)"'
|
||||
|
||||
# 测试7: 成交列表
|
||||
echo "[成交列表]"
|
||||
DEALS=$(curl -s "$API/deals")
|
||||
check "成交列表非空" 'echo "$DEALS" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d)>0 else 1)"'
|
||||
|
||||
# 测试8: 同步状态
|
||||
echo "[同步状态]"
|
||||
SYNC=$(curl -s "$API/sync/status")
|
||||
check "同步状态返回3条" 'echo "$SYNC" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d)==3 else 1)"'
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " 通过: $PASS 失败: $FAIL"
|
||||
echo "=========================================="
|
||||
[ "$FAIL" -eq 0 ] && exit 0 || exit 1
|
||||
Reference in New Issue
Block a user