Initial commit: AI Interview System

This commit is contained in:
111
2026-01-23 13:57:48 +08:00
commit 95770afe21
127 changed files with 24686 additions and 0 deletions

137
backend/insert_full_mock.py Normal file
View File

@@ -0,0 +1,137 @@
"""
插入包含完整评分字段的 Mock 数据
"""
import asyncio
import httpx
import json
import uuid
import random
COZE_PAT_TOKEN = 'pat_nd1wU47WyPS9GCIyJ1clnH8h1WOQXGrYELX8w73TnSZaYbFdYD4swIhzcETBUbfT'
WORKFLOW_ID = '7597376294612107318'
CANDIDATES = [
{'name': '周雪琴', 'base_score': 88},
{'name': '陈美华', 'base_score': 75},
{'name': '林婷婷', 'base_score': 92},
{'name': '黄丽萍', 'base_score': 65},
{'name': '吴晓燕', 'base_score': 82},
]
async def execute_sql(sql: str, table: str) -> dict:
headers = {
'Authorization': f'Bearer {COZE_PAT_TOKEN}',
'Content-Type': 'application/json'
}
payload = {
'workflow_id': WORKFLOW_ID,
'parameters': {
'input': json.dumps({'table': table, 'sql': sql}, ensure_ascii=False)
}
}
async with httpx.AsyncClient(timeout=30.0) as client:
r = await client.post('https://api.coze.cn/v1/workflow/run', headers=headers, json=payload)
return r.json()
def gen_score(base: int, variance: int = 10) -> int:
return max(50, min(100, base + random.randint(-variance, variance)))
def get_level(score: int) -> str:
if score >= 85:
return "优秀"
elif score >= 70:
return "良好"
else:
return "一般"
def escape_sql(s: str) -> str:
return s.replace("'", "''")
async def main():
print('插入包含完整评分的 Mock 数据...')
print('=' * 50)
for idx, c in enumerate(CANDIDATES, 1):
session_id = f'MOCK_{uuid.uuid4().hex[:8].upper()}'
base = c['base_score']
name = c['name']
# 生成各维度分数
skill_score = gen_score(base)
concept_score = gen_score(base)
competency_score = gen_score(base)
avg_score = round((skill_score + concept_score + competency_score) / 3)
# 生成报告
skill_level = get_level(skill_score)
concept_level = get_level(concept_score)
competency_level = get_level(competency_score)
skill_report = f"销售技能评估:该候选人展现出{skill_level}的销售技巧。得分 {skill_score} 分。"
concept_report = f"销售观念评估:候选人对销售工作的认知{concept_level}。得分 {concept_score} 分。"
competency_report = f"综合素质评估:候选人的学习能力和抗压能力{competency_level}。得分 {competency_score} 分。"
recommend = "强烈推荐录用" if avg_score >= 85 else ("建议录用" if avg_score >= 70 else "建议观察")
final_report = f"""## 面试评估报告
**候选人**: {name}
**综合评分**: {avg_score}/100
### 各维度评分
- 销售技能: {skill_score}
- 销售观念: {concept_score}
- 综合素质: {competency_score}
### 建议
{recommend}
"""
# 完整的 INSERT 语句
sql = f"""INSERT INTO ci_interview_assessments (
session_id, candidate_name, current_stage,
sales_skill_score, sales_skill_report,
sales_concept_score, sales_concept_report,
competency_score, competency_report,
final_score_report
) VALUES (
'{session_id}', '{name}', 'completed',
'{skill_score}', '{escape_sql(skill_report)}',
'{concept_score}', '{escape_sql(concept_report)}',
'{competency_score}', '{escape_sql(competency_report)}',
'{escape_sql(final_report)}'
)"""
result = await execute_sql(sql, 'assessments')
status = '' if result.get('code') == 0 else f"❌ code={result.get('code')}"
print(f'{idx}. {name}: 技能{skill_score} 观念{concept_score} 素质{competency_score} -> {status}')
# 插入对话记录
dialogues = [
('销售技能', '请描述一次成功的销售经历', '我曾经成功说服一位犹豫的客户购买了我们的高端护肤套装,通过了解她的肤质问题,提供了针对性的方案。'),
('销售观念', '您认为什么是好的销售', '好的销售是真正帮助客户解决问题,建立长期信任关系,而不是一次性交易。'),
('综合素质', '遇到困难时您如何应对', '我会先冷静分析问题的原因,制定解决方案,并保持积极的心态去执行。'),
]
for j, (stage, q, a) in enumerate(dialogues, 1):
log_id = f'LOG_{session_id}_{j:02d}'
log_sql = f"""INSERT INTO ci_interview_logs (
log_id, session_id, stage, round, ai_question, user_answer, log_type
) VALUES (
'{log_id}', '{session_id}', '{stage}', '{j}',
'{escape_sql(q)}', '{escape_sql(a)}', 'interview'
)"""
await execute_sql(log_sql, 'logs')
await asyncio.sleep(0.3)
print('=' * 50)
print('✅ 完成!')
if __name__ == '__main__':
asyncio.run(main())