test_bid_review.py 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import requests, json, time
  2. BASE = 'http://localhost:8000/api/v1'
  3. # 1. 投标人登录
  4. r = requests.post(f'{BASE}/auth/login',
  5. json={'username': 'bidder01', 'password': 'Bidder@123456'})
  6. bidder_token = r.json()['access_token']
  7. bidder_headers = {'Authorization': f'Bearer {bidder_token}'}
  8. print('✅ 投标人登录成功')
  9. # 2. 评审专家登录
  10. r = requests.post(f'{BASE}/auth/login',
  11. json={'username': 'expert01', 'password': 'Expert@123456'})
  12. expert_token = r.json()['access_token']
  13. expert_headers = {'Authorization': f'Bearer {expert_token}', 'Content-Type': 'application/json'}
  14. print('✅ 评审专家登录成功')
  15. # 3. 投标人提交投标文件
  16. print('\n=== 提交投标文件 ===')
  17. bid_review_id = 'aaaaaaaa-0000-0000-0000-000000000001'
  18. with open('/Users/ligang/Desktop/TenderAgent/tests/fixtures/test_bid_review_answer.docx', 'rb') as f:
  19. r = requests.post(f'{BASE}/bid_review/submit',
  20. headers=bidder_headers,
  21. data={'bid_review_id': bid_review_id},
  22. files={'file': ('test_bid_review_answer.docx', f, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')})
  23. print(f'状态码: {r.status_code}')
  24. if r.status_code != 202:
  25. print(f'错误: {r.text}')
  26. exit(1)
  27. data = r.json()
  28. submission_id = data['submission_id']
  29. print(f'submission_id: {submission_id}')
  30. print(f'消息: {data["message"]}')
  31. # 4. 轮询等待 AI 评分完成(状态变为 pending_review)
  32. print('\n等待 AI 评分完成...')
  33. for i in range(36): # 最多等3分钟
  34. time.sleep(5)
  35. r = requests.get(f'{BASE}/bid_review/pending-reviews', headers=expert_headers)
  36. if r.status_code == 200:
  37. items = r.json().get('items', [])
  38. submission = next((x for x in items if x['submission_id'] == submission_id), None)
  39. if submission:
  40. print(f'\n [{i*5+5}s] 待确认列表中找到提交!')
  41. print(f' 投标人: {submission["bidder_name"]}')
  42. print(f' AI预评分: {submission["pre_review"]["total_score"]}/{submission["pre_review"]["full_score"]}分')
  43. print(f' 需复核题数: {submission["pre_review"]["needs_review_count"]}')
  44. if submission["weak_points"]:
  45. print(f' 薄弱点: {[wp.get("tag", wp.get("knowledge_tag","?")) for wp in submission["weak_points"][:3]]}')
  46. break
  47. else:
  48. print(f' [{i*5+5}s] 状态: {r.status_code}')
  49. else:
  50. print('❌ 等待超时')
  51. exit(1)
  52. # 5. 评审专家获取详情
  53. print('\n=== 获取预评分详情 ===')
  54. r = requests.get(f'{BASE}/bid_review/submissions/{submission_id}/review', headers=expert_headers)
  55. print(f'状态码: {r.status_code}')
  56. if r.status_code == 200:
  57. detail = r.json()
  58. summary = detail['pre_review_summary']
  59. print(f'总分: {summary.get("total_score")}/{summary.get("full_score")} ({round(summary.get("score_rate",0)*100)}%)')
  60. print(f'需复核: {summary.get("needs_review_count")} 题')
  61. print(f'薄弱点数: {len(detail.get("weak_points", []))}')
  62. if detail.get("weak_points_summary"):
  63. print(f'薄弱点摘要: {detail["weak_points_summary"][:100]}')
  64. # 6. 评审专家 Approve
  65. print('\n=== 评审专家批准发布 ===')
  66. r = requests.post(f'{BASE}/bid_review/submissions/{submission_id}/confirm',
  67. headers=expert_headers,
  68. json={'action': 'approve', 'modifications': []})
  69. print(f'状态码: {r.status_code}')
  70. if r.status_code == 200:
  71. result = r.json()
  72. print(f'✅ 发布成功!')
  73. print(f'最终得分: {result["final_score"]}/{result["full_score"]} ({result["score_rate"]*100:.1f}%)')
  74. print(f'薄弱点数: {len(result["weak_points"])}')
  75. if result.get("weak_points_summary"):
  76. print(f'薄弱点摘要: {result["weak_points_summary"][:150]}')
  77. else:
  78. print(f'错误: {r.text}')