| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- import requests, json, time
- BASE = 'http://localhost:8000/api/v1'
- # 1. 投标人登录
- r = requests.post(f'{BASE}/auth/login',
- json={'username': 'bidder01', 'password': 'Bidder@123456'})
- bidder_token = r.json()['access_token']
- bidder_headers = {'Authorization': f'Bearer {bidder_token}'}
- print('✅ 投标人登录成功')
- # 2. 评审专家登录
- r = requests.post(f'{BASE}/auth/login',
- json={'username': 'expert01', 'password': 'Expert@123456'})
- expert_token = r.json()['access_token']
- expert_headers = {'Authorization': f'Bearer {expert_token}', 'Content-Type': 'application/json'}
- print('✅ 评审专家登录成功')
- # 3. 投标人提交投标文件
- print('\n=== 提交投标文件 ===')
- bid_review_id = 'aaaaaaaa-0000-0000-0000-000000000001'
- with open('/Users/ligang/Desktop/TenderAgent/tests/fixtures/test_bid_review_answer.docx', 'rb') as f:
- r = requests.post(f'{BASE}/bid_review/submit',
- headers=bidder_headers,
- data={'bid_review_id': bid_review_id},
- files={'file': ('test_bid_review_answer.docx', f, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')})
- print(f'状态码: {r.status_code}')
- if r.status_code != 202:
- print(f'错误: {r.text}')
- exit(1)
- data = r.json()
- submission_id = data['submission_id']
- print(f'submission_id: {submission_id}')
- print(f'消息: {data["message"]}')
- # 4. 轮询等待 AI 评分完成(状态变为 pending_review)
- print('\n等待 AI 评分完成...')
- for i in range(36): # 最多等3分钟
- time.sleep(5)
- r = requests.get(f'{BASE}/bid_review/pending-reviews', headers=expert_headers)
- if r.status_code == 200:
- items = r.json().get('items', [])
- submission = next((x for x in items if x['submission_id'] == submission_id), None)
- if submission:
- print(f'\n [{i*5+5}s] 待确认列表中找到提交!')
- print(f' 投标人: {submission["bidder_name"]}')
- print(f' AI预评分: {submission["pre_review"]["total_score"]}/{submission["pre_review"]["full_score"]}分')
- print(f' 需复核题数: {submission["pre_review"]["needs_review_count"]}')
- if submission["weak_points"]:
- print(f' 薄弱点: {[wp.get("tag", wp.get("knowledge_tag","?")) for wp in submission["weak_points"][:3]]}')
- break
- else:
- print(f' [{i*5+5}s] 状态: {r.status_code}')
- else:
- print('❌ 等待超时')
- exit(1)
- # 5. 评审专家获取详情
- print('\n=== 获取预评分详情 ===')
- r = requests.get(f'{BASE}/bid_review/submissions/{submission_id}/review', headers=expert_headers)
- print(f'状态码: {r.status_code}')
- if r.status_code == 200:
- detail = r.json()
- summary = detail['pre_review_summary']
- print(f'总分: {summary.get("total_score")}/{summary.get("full_score")} ({round(summary.get("score_rate",0)*100)}%)')
- print(f'需复核: {summary.get("needs_review_count")} 题')
- print(f'薄弱点数: {len(detail.get("weak_points", []))}')
- if detail.get("weak_points_summary"):
- print(f'薄弱点摘要: {detail["weak_points_summary"][:100]}')
- # 6. 评审专家 Approve
- print('\n=== 评审专家批准发布 ===')
- r = requests.post(f'{BASE}/bid_review/submissions/{submission_id}/confirm',
- headers=expert_headers,
- json={'action': 'approve', 'modifications': []})
- print(f'状态码: {r.status_code}')
- if r.status_code == 200:
- result = r.json()
- print(f'✅ 发布成功!')
- print(f'最终得分: {result["final_score"]}/{result["full_score"]} ({result["score_rate"]*100:.1f}%)')
- print(f'薄弱点数: {len(result["weak_points"])}')
- if result.get("weak_points_summary"):
- print(f'薄弱点摘要: {result["weak_points_summary"][:150]}')
- else:
- print(f'错误: {r.text}')
|