feat(check): 文件要在、扫描件兜底(C10);响应方式存进清单并可改(C12)
- check/presence.py:「提供《授权委托书》」「须提交投标函」这类要求按标题里有没有这个文件名判断,不调模型。
- 扫描件兜底:要附证明材料的要求没找到、投标文件里有扫描件页时,改为提示级「可能在扫描件里,请人工核对」。
- 响应方式解析时识别、带依据句子存进 checklist.response_modes(迁移 0008);清单页显示、可改(写审计,
重新解析不覆盖人工改过的);查标用存下来的。新接口 PUT /projects/{id}/checklist/response-modes/{category}。
- check_item_result.layer 加 presence(迁移 0007);契约同步默认接受的两种结论。
开发集 17 份:规矩投标文件的致命问题 120 → 51,致命级召回不变(22 / 32)(docs/architecture/check-eval.md §5)。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -251,3 +251,24 @@ async def test_other_tenant_cannot_see_check(app_client: httpx.AsyncClient) -> N
|
||||
assert (await b.post(f"/findings/{f['id']}/resolve", json={"status": "modified"})).status_code == 404
|
||||
assert (await b.post(f"/findings/{f['id']}/reopen")).status_code == 404
|
||||
assert (await b.post(f"/check-runs/{run['id']}/cancel")).status_code == 404
|
||||
|
||||
|
||||
async def test_response_modes_are_stored_editable_and_used(user: User) -> None:
|
||||
"""响应方式(C12):解析时存进清单;用户改成「默认接受」后,查标对没复述的一般要求不再报问题。"""
|
||||
project_id, tender_id = await project_with_tender(user)
|
||||
await run_parse(user, tender_id)
|
||||
modes = {m["category"]: m for m in (await user.get(f"/projects/{project_id}/checklist")).json()["response_modes"]}
|
||||
assert set(modes) == {"technical", "commercial"}
|
||||
assert modes["technical"]["mode"] == "explicit" and modes["technical"]["status"] == "unknown"
|
||||
|
||||
r = await user.put(f"/projects/{project_id}/checklist/response-modes/technical", json={"mode": "implicit"})
|
||||
assert r.status_code == 200, r.text
|
||||
tech = next(m for m in r.json()["response_modes"] if m["category"] == "technical")
|
||||
assert tech["origin"] == "human" and tech["mode"] == "implicit" and tech["set_by"]["name"] == "张工"
|
||||
|
||||
bid = await upload_bid(user, project_id, "bid-mini-v1.pdf")
|
||||
run = await run_check(user, project_id, [bid["id"]])
|
||||
# 漏掉的 BFD 是 ★ 条款:默认接受下不报致命,改为提示级「请人工核对」
|
||||
(f,) = await findings(user, run["id"])
|
||||
assert f["type"] == "manual_review" and f["severity"] == "hint"
|
||||
assert run["counts"]["fatal"] == 0
|
||||
|
||||
Reference in New Issue
Block a user